1. 程式人生 > >springboot結合spring-data-jpa的動態查詢

springboot結合spring-data-jpa的動態查詢

Criteria API

這套API可用於構建對資料庫的查詢。
型別安全。通過定義元資料模型,在程式編譯階段就可以對型別進行檢查,不像SQL需要與Mysql進行互動後才能發現型別問題。
如下即為元資料模型。建立一個元模型類,類名最後一個字元為下劃線,內部的成員變數與Girl.class這個實體類的屬性值相對應。

可移植。API並不依賴具體的資料庫,可以根據資料庫型別的不同生成對應資料庫型別的SQL,所以其為可移植的。
面向物件。Criteria API是使用的是各種類和物件如CriteriaQuery、Predicate等構建查詢,是面向物件的。而如果直接書寫SQL則相對於面向的是字串。

第一種:通過JPA的Criteria API實現

  1. EntityManager獲取CriteriaBuilder
  2. CriteriaBuilder建立CriteriaQuery
  3. CriteriaQuery指定要查詢的表,得到Root<Girl>,Root代表要查詢的表
  4. CriteriaBuilder建立條件Predicate,Predicate相對於SQL的where條件,多個Predicate可以進行與、或操作。
  5. 通過EntityManager建立TypedQuery
  6. TypedQuery執行查詢,返回結果

第二種:DAO層介面實現JpaSpecificationExecutor<T>介面

JpaSpecificationExecutor如下,方法引數Specification介面有一個方法toPredicate,返回值正好是Criteria API中的Predicate,而Predicate相對於SQL的where條件。與上一個方法相比,這種寫法不需要指定查詢的表是哪一張,也不需要自己通過Criteria API實現排序和分頁,只需要通過新建Pageable、Sort物件並傳參給findAll方法即可,簡便一些。

public interface JpaSpecificationExecutor<T> {
    T findOne(Specification<T> spec);
    List<T> findAll(Specification<T> spec);
    Page<T> findAll(Specification<T> spec, Pageable pageable);
    List<T> findAll(Specification<T> spec, Sort sort);
    long count(Specification<T> spec);
}

GirlService實現JpaSpecificationExecutor

實現Specification