Specification接口里的toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb)


其中 Root是查詢結果的一個實體對象,也就是查詢結果返回的主要對象,其中一對多OR多對一就是從這個對象開始計算的,具體層級關系
javax.persistence.TupleElement<X>
javax.persistence.criteria.Selection<X>
javax.persistence.criteria.Expression<T>
javax.persistence.criteria.Path<X>
javax.persistence.criteria.From<Z, X>
javax.persistence.criteria.Root<X>
這幾個接口主要用於描述一個數據庫對象與實體對象的對應關系,就不多說了。
然后是javax.persistence.criteria.CriteriaQuery<T>,這個是JPA標准,主要是構建查詢條件的,里面的方法都是各種查詢方式:distinct、select、where、groupby、having、orderby這些方法,想必大家都知道這些是組件SQL語句的基本方法。
接下來是javax.persistence.criteria.CriteriaBuilder,這個接口主要是用來進行一些函數操作,不過我們這里先關注JPA標准中Hibernate的兩個實現方法:
1.and org.hibernate.ejb.criteria.CriteriaBuilderImpl.and(Predicate...)
2.or org.hibernate.ejb.criteria.CriteriaBuilderImpl.or(Predicate...)
這兩個方法都有一個關鍵的接口:Predicate(javax.persistence.criteria.Predicate);
這個接口,同為Expression(javax.persistence.criteria.Expression<Boolean>)的子接口,可以肯定也是字段相關的表達式,在實際操作中,這個接口也是作為關聯各種Predicate的核心操作接口,and方法是將各個條件作為and來拼接,進行查詢;or是將各條件作為or來拼接,進行查詢。
然后說如何生成一個Predicate接口,生成的核心類還是上面的CriteriaBuilder(javax.persistence.criteria.CriteriaBuilder),在這個接口中,很多方法都是返回Predicate接口的,其中包含between、gt(大於)、lt(小於)、not(非)等等操作,將所需要的這些查詢條件都放在一個array數組(或者采用java.util.ArrayList.toArray(T[])-->cb.and(predicateList.toArray(new Predicate[predicates.size()]))),然后調用上一步說的and或者or方法進行拼接,當然,如果一個查詢既有and又有or,用這種方式還沒有具體嘗試過,有待考證。

Root:查詢哪個表
CriteriaQuery:查詢哪些字段,排序是什么
CriteriaBuilder:字段之間是什么關系,如何生成一個查詢條件,每一個查詢條件都是什么方式
Predicate(Expression):單獨每一條查詢條件的詳細描述

/** 查詢名字包含icarus,或者手機號包含188的用戶(如果return中的or改為and,就是查詢名字包含icarus,並且手機號包含188的用戶) */
// query = cb.createQuery(User.class);// query是這么出來的
List<Predicate> predicateList = new ArrayList<>();
root = query.from(User.class);
Path<String> nameExp = root.get("name");
Predicate p1 = cb.like(nameExp, "%icarus%");
Path<String> phoneExp = root.get("phone");
Predicate p2 = cb.like(phoneExp, "%188%");
predicateList.add(p1);
predicateList.add(p2);
return cb.or(predicateList.toArray(new Predicate[predicates.size()]));

https://www.cnblogs.com/sandea/p/7803731.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM