源碼
在Spring Data JPA相關的文章[位址]中提到了有哪幾種方式可以建構Specification的執行個體,該處需要借助CriteriaBuilder,回顧一下Specification中toPredicate方法的定義,代碼如下:
CriteriaBuilder接口定義在包路徑javax.persistence.criteria下,代碼如下:

CriteriaBuilder中的一些方法如下圖所示:
解讀:
(1)CriteriaBuilder中的方法分為幾個類别,譬如:ordering、aggregate functions、subqueries、equality、comparisons等等。
(2)CriteriaBuilder中的方法的傳回值主要有CriteriaQuery、Expression、Predicate等幾種類型。
示例
觀察CriteriaBuilder中and方法與or方法的定義,如下:
上述and方法與or方法用于組合多個查詢條件。
其中Predicate and(Predicate... restrictions);方法使用不定數參數Predicate... restrictions,使用and連接配接詞連接配接起來,通常可以傳入多個Predicate參數,最佳實踐是傳入一個數組。
具體案例——添加多個查詢條件
上述着色處代碼以and方法将兩個條件組合在一起
Predicate與Expression
從前面的分析可知,CriteriaBuilder中的很多方法接受Expression或者Predicate類型的參數,并傳回Expression或者Predicate類型的結果,譬如上面提到的and方法,是以本小節來探尋一下Expression與Predicate之間的關系。
Expression與Predicate之間的關系如下圖所示:
Predicate接口繼承了Expression接口,是以CriteriaBuilder中接受Expression類型參數的方法(譬如:and方法等)可以接受Predicate類型的參數,正如前面示例所展示的那樣。
Note:
Path接口也繼承了Expression接口,是以CriteriaBuilder中接受Expression類型參數的方法(譬如:lt方法)可以接受Path類型執行個體:
上述示例在構造了Path類型的變量後調用了lt方法,該方法的定義如下: