JPA之定義查詢方法
1、定義查詢方法的配置方法
1)只要實體Repository集成Spring Data Common中的Repository接口即可。若想擁有更多默認通用方法實現,可選擇JpaRepository、PagingAndSortingRepository、CrudRepository等接口。
1>從名稱中指定特定用於存儲的查詢和更新
2>使用@Query手動定義查詢
2)自定義Repository
選擇性暴露CRUD方法
@NoRepositoryBeaninterface
MyBaseRepository<T, ID extends Serializable> extends Repository<T, ID>{
T findOne(ID, id);
T save(T entity);
}
interface UserRepository extends MyBaseRepository<User, Long>{
User findByEmailAddress(EmailAddress emailAddress);
}
爲所有域存儲庫定義了一個公共基礎接口,並將其暴露出來。
findOne()、save()方法將被路由到Spring Data中提供的、你選擇的存儲庫的基本存儲實現中,如SimpleJpaRepository。
UserRepository能夠保存用戶、通過id查找單個用戶信息、通過電子郵件地址查找Users。
2、方法的查詢策略設置
通過@EnableJpaRepository(queryLookUpStrategy= QueryLookUpStrategy.Key.CREATE_IF_NOT_FOUND)可以配置方法的查詢策略,QueryLookUpStrategy.Key的值共有3個:
1> CREATE: 直接根據方法名進行創建;若方法名不符合規則,就拋出異常。
2> USE_DECLARED_QUERY: 註解方式;啓動時嘗試找一個聲明的查詢,找不到則拋出異常。
3> CREATE_IF_NOT_FOUND: 默認方式;以上兩種方式的結合版,先用聲明方式查找,找不到則創建查詢。
通常採用默認方式,不用管。
3、查詢方法的創建
Spring內部基礎架構有根據方法名生成查詢,該機制的前綴有:find...By...,read...By...,query...By...,count...By...,get...By...。
示例:
List<User> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
List<User> findByLastnameIgnoreCase(String lastname);
List<User> findByLastnameOrderByFirstnameAsc(String lastname);
4、關鍵字列表
And/Or/Is、Equals/Between/LessThan/GreaterThanEqual/
After/IsNull/Like/StartingWith/EndingWith/Containing/Not/In/True/False等等
刪除前綴:deleteBy、removeBy。
5、屬性表達式
//address屬性中含有ZipCode屬性
List<Person> findByAddressZipCode(String zipCode);
//假設Person中同時含有addressZip屬性,會導致方法名分割錯誤,這時可以手動定義遍歷點
List<Person> findByAddress_Zip(ZipCode zipCode);
6、查詢結果處理
1)分頁和排序
Page<User> findByLastname(String lastname, Pageable pageable);
Slice<User> findByLastname(Strig lastname, Pageable pageable);
List<User> findByLastname(String lastname, Sort sort);
List<User> findByLastname(String lastname, Pageable pageable);
限制查詢結果
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);
對於結果限制爲僅有一個實例的查詢,支持將結果包裝到一個實例中的Optional中。
2)查詢結果的不同形式
普通結果形式:Page、List。特殊結果形式有:
流式查詢結果
@Query("select u from User u")
Stream<User> findAllByCustomQueryAndStream();
Stream<User> readAllByFirstnameNotNull();
@Query("select u from User u")
Stream<User> streamAllPaged(Pageable pageable);
異步查詢結果
異步方法執行功能異步的存儲庫查詢,方法將在調用時立即返回,實際的查詢執行將發生在已提交給Spring TaskExecutor的任務中,比較適合定時任務的實際場景。
@Async
Future<User> findByFirstname(String firstname);
@Async
CompletableFuture<User> findOneByFirstname(String firstname);
@Async
ListenableFuture<User> findOneByLastname(String lastname);
Projections對查詢結果的擴展
看不懂,待補充
7、實現機制介紹