(將對Springdata JPA的API 第三章之后進行解釋)
一 . Core concepts(核心概念)
1.springdata中的中心接口是——Repository。這個接口沒有什么重要的功能(原句稱沒什么驚喜的一個接口)。主要的作用就是標記和管理。其他的接口都是此接口的子類。
Example 1:
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,增加了一些方法來實現分頁。
Example 2:
1 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 }
Example 3:Sort中創建的是自定義的排序方式,PageRequest中創建的是自定義分頁的方式(注意:分頁索引是從0開始,所以想要查詢第一頁二十條數據時,應插入(0,20))。
dao層:
Controller(直接調用,沒通過Service):
2)除了普通查詢,計數和刪除查詢都可以使用
Example 4:計數查詢
dao:
controller:
Example 5:派生刪除查詢
dao:
controller:
3.查詢數據
Spring Data,將查詢數據的方法分成了四個步驟。用處不大,在此不詳述。
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提供了一些注解,用來對付這種空值請情況。
Example 7:
interface UserRepository : Repository<User, String> { fun findByUsername(username: String): User //該方法當傳入一個空的參數時,將會拋出一個 EmptyResultDataAccessException fun findByFirstname(firstname: String?): User? //該方法接受零
作為參數firstname
並返回零
在查詢執行不會產生結果。 }
6.查詢方法
Spring中的基礎架構中,有一種查詢構建機制的約束。這種約束會忽略像find…By
,read…By
,query…By
,count…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.方法中支持的關鍵字
lile在使用時,需要在字符串中加上“%%”
Distinct去重
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);