springboot結合spring-data-jpa的動態查詢
阿新 • • 發佈:2019-02-04
Criteria API
這套API可用於構建對資料庫的查詢。
型別安全。通過定義元資料模型,在程式編譯階段就可以對型別進行檢查,不像SQL需要與Mysql進行互動後才能發現型別問題。
如下即為元資料模型。建立一個元模型類,類名最後一個字元為下劃線,內部的成員變數與Girl.class這個實體類的屬性值相對應。
可移植。API並不依賴具體的資料庫,可以根據資料庫型別的不同生成對應資料庫型別的SQL,所以其為可移植的。
面向物件。Criteria API是使用的是各種類和物件如CriteriaQuery、Predicate等構建查詢,是面向物件的。而如果直接書寫SQL則相對於面向的是字串。
第一種:通過JPA的Criteria API實現
- EntityManager獲取CriteriaBuilder
- CriteriaBuilder建立CriteriaQuery
- CriteriaQuery指定要查詢的表,得到Root<Girl>,Root代表要查詢的表
- CriteriaBuilder建立條件Predicate,Predicate相對於SQL的where條件,多個Predicate可以進行與、或操作。
- 通過EntityManager建立TypedQuery
- 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