springDataJpa的官方API


一 .  Core concepts(核心概念)

1.springdata中的中心接口是——Repository。這個接口沒有什么重要的功能(原句稱沒什么驚喜的一個接口)。主要的作用就是標記和管理。其他的接口都是此接口的子類。

 

Example 1:

 

 
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
 2     <S extends T> S save(S var1);//保存給定的實體
 3 
 4     <S extends T> Iterable<S> save(Iterable<S> var1);//保存指定的實體集合
 5 
 6     T findOne(ID var1);查詢指定id的實體
 7 
 8     boolean exists(ID var1);//判斷一個實體是否與給定的ID存在
 9 
10     Iterable<T> findAll();//返回所有實體
11 
12     Iterable<T> findAll(Iterable<ID> var1);//查詢指定的實體集合
13 
14     long count();//該實體的總數
15 
16     void delete(ID var1);//根據id刪除指定實體
17 
18     void delete(T var1);//刪除指定實體
19 
20     void delete(Iterable<? extends T> var1);//刪除指定的實體集合
21 
22     void deleteAll();//刪除全部
23 }


除此還提供了一些技術相關的接口,比如 JpaRepository,MongoRepository這兩個接口繼承了CrudRepository。

2.CrudRepository

1)CrudRepository有個子類PagingAndSortingRepository,增加了一些方法來實現分頁。

 

public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {
2     Iterable<T> findAll(Sort var1);
3 
4     Page<T> findAll(Pageable var1);
5 }

2)除了普通查詢,計數和刪除查詢都可以使用

Example 4:計數查詢

dao:

controller:

Example 5:派生刪除查詢

dao:

controller:

 

 3.查詢數據

 

4.定義dao層的繼承接口

 

通常,dao層接口將會繼承Repository,CrudRepository 或者PagingAndSortingRepository 。

或者不想繼承Springdata的接口,你也可以定義個自己的接口@RepositoryDefinition,繼承CrudRepository 。可以定義一套完整的自己的方法。

 

Example 6:

 

復制代碼
 1 @NoRepositoryBean
 2 interface MyBaseRepository<T, ID extends Serializable> extends Repository<T, ID> {
 3 
 4   Optional<T> findById(ID id);
 5 
 6   <S extends T> S save(S entity);
 7 }
 8 
 9 interface UserRepository extends MyBaseRepository<User, Long> {
10   User findByEmailAddress(EmailAddress emailAddress);
11 }
復制代碼

 5.空庫

spring提供了一些注解,用來對付這種空值請情況。

@NonNullApi(默認,不接受零)
@NonNull(可用來約束參數或返回值必須不能為零)
@Nullable(可用來約束參數或返回值可以為零)

Example 7:

interface UserRepository : Repository<User, String> {

  fun findByUsername(username: String): User //該方法當傳入一個空的參數時,將會拋出一個 EmptyResultDataAccessException  

  fun findByFirstname(firstname: String?): User? //該方法接受作為參數 firstname 並返回 零 在查詢執行不會產生結果。 }

 

6.查詢方法

Spring中的基礎架構中,有一種查詢構建機制的約束。這種約束會忽略像 find…Byread…Byquery…Bycount…By,和

get…By這種前綴,而開始分析其余部分。當然還可以引入進一步的表達式,可以定義實體中的一些條件,用and或者or對他們進行連接。

Example 8:

復制代碼
interface PersonRepository extends Repository<User, Long> {

  List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);

  // Enables the distinct flag for the query
  List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
  List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);

  // Enabling ignoring case for an individual property
  List<Person> findByLastnameIgnoreCase(String lastname);
  // Enabling ignoring case for all suitable properties
  List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);

  // Enabling static ORDER BY for a query
  List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
  List<Person> findByLastnameOrderByFirstnameDesc(String lastname);
}


復制代碼

IgnoreCase屬性表示忽略大小寫

OrderBy表示引用屬性進行查找時附加子句並提供排序方向(Asc或Desc)

7.關於特殊參數的處理(比如Pageable和Sort in查詢方法)

Example 9:

復制代碼
Page<User> findByLastname(String lastname, Pageable pageable);

Slice<User> findByLastname(String lastname, Pageable pageable);

List<User> findByLastname(String lastname, Sort sort);

List<User> findByLastname(String lastname, Pageable pageable);

 

8.關於限制查詢的結果

查詢方法的結果可以通過關鍵字來限制,first或者top都可以互換使用。且后面可以直接加數字指定需要的前幾位結果。

Example 10:

復制代碼
User findFirstByOrderByLastnameAsc();

User findTopByOrderByAgeDesc();

Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);

Slice<User> findTop3ByLastname(String lastname, Pageable pageable);

List<User> findFirst10ByLastname(String lastname, Sort sort);

List<User> findTop10ByLastname(String lastname, Pageable pageable)
復制代碼

 

 9.方法中支持的關鍵字

8.關於限制查詢的結果

查詢方法的結果可以通過關鍵字來限制,first或者top都可以互換使用。且后面可以直接加數字指定需要的前幾位結果。

Example 10:

復制代碼
User findFirstByOrderByLastnameAsc();

User findTopByOrderByAgeDesc();

Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);

Slice<User> findTop3ByLastname(String lastname, Pageable pageable);

List<User> findFirst10ByLastname(String lastname, Sort sort);

List<User> findTop10ByLastname(String lastname, Pageable pageable)
復制代碼

 

 9.方法中支持的關鍵字,詳情見慕課網springData,Reposotory查詢方法命名規則

10.使用注解 @Query

Example 11:

public interface UserRepository extends JpaRepository<User, Long> {

  @Query("select u from User u where u.emailAddress = ?1")
  User findByEmailAddress(String emailAddress);
}

 Example 12:使用命名參數

public interface UserRepository extends JpaRepository<User, Long> {

  @Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname")
  User findByLastnameOrFirstname(@Param("lastname") String lastname,
                                 @Param("firstname") String firstname);
}

 

  Example 13:聲明操作查詢

 
@Modifying
@Query("update User u set u.firstname = ?1 where u.lastname = ?2")
int setFixedFirstnameFor(String firstname, String lastname);

 

 
 
 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM