Spring Data JPA學習筆記(二)

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、實現機制介紹

 

發佈了23 篇原創文章 · 獲贊 23 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章