javascript
Spring Data JPA 从入门到精通~JpaSpecificationExecutor的使用方法
?JpaSpecificationExecutor 源碼和 API
我們也可以通過 idea 工具詳細看其用法和實現類,JpaSpecificationExecutor 是 Repository 要繼承的接口,而 SimpleJpaRepository 是其默認實現。而通過源碼來看其提供的 API 比較簡單、明了,有如下幾個方法:
public interface JpaSpecificationExecutor<T> {//根據 Specification 條件查詢單個對象,注意的是,如果條件能查出來多個會報錯T findOne(@Nullable Specification<T> spec);//根據 Specification 條件查詢 List 結果List<T> findAll(@Nullable Specification<T> spec);//根據 Specification 條件,分頁查詢Page<T> findAll(@Nullable Specification<T> spec, Pageable pageable);//根據 Specification 條件,帶排序的查詢結果List<T> findAll(@Nullable Specification<T> spec, Sort sort);//根據 Specification 條件,查詢數量long count(@Nullable Specification<T> spec); }不難看出,這個接口基本是圍繞著 Specification 接口來定義的。我們先來看下其源碼:
仔細看看圖,就會發(fā)現 Specifications 的接口實現類就三個。
/*** Specifications 是 Spring Data JPA 對 Specification 的聚合操作工具類,里面有以下四個方法: */ @Deprecated //已經不推薦使用了,我們可以用 Specification 來代替,如上圖。 public class Specifications<T> implements Specification<T>, Serializable {private final Specification<T> spec;//構造方法私有化,只能通過 where/not 創(chuàng)建 Specifications 對象。private Specifications(Specification<T> spec) {this.spec = spec;}//創(chuàng)建 where 后面的 Predicate 集合public static <T> Specifications<T> where(Specification<T> spec) {return new Specifications<T>(spec);}//創(chuàng)建 not 集合的 Predicatepublic static <T> Specifications<T> not(Specification<T> spec) {return new Specifications<T>(new NegatedSpecification<T>(spec));}//Specification 的 and 關系集合public Specifications<T> and(Specification<T> other) {return new Specifications<T>(new ComposedSpecification<T>(spec, other, AND));}//Specification 的 or 關系集合public Specifications<T> or(Specification<T> other) {return new Specifications<T>(new ComposedSpecification<T>(spec, other, OR));} ...... }而如果查看 Specifications 源碼的話就會發(fā)現,其已經將來要被刪除了,已經不推薦使用了,而另外兩個都是局部私有的,所以真正關注的就是 Specification 接口中如下一個接口方法:
public interface Specification<T> {Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb); }從這里可以看出,每個調用的地方都需要,創(chuàng)建 Specification 的實現類,而 JpaSpecificationExecutor 是針對 Criteria API 進行了 predicate 標準封裝,幫我們封裝了通過 EntityManager 的查詢和使用細節(jié),使操作 Criteria 更加便利了一些。所以我們要掌握一下 Predicate、Root、CriteriaQuery、CriteriaBuilder 是什么?
總結
以上是生活随笔為你收集整理的Spring Data JPA 从入门到精通~JpaSpecificationExecutor的使用方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mockito教程--思维导图笔记
- 下一篇: linux ssh 时间设置,Linux