CriteriaQuery
CriteriaQuery定義在包路徑javax.persistence.criteria下,其定義如下:
CriteriaQuery對應的類圖如下:

此處聚焦CriteriaQuery繼承體系中定義了哪些方法,請參見下圖:
解讀:
根據上述方法的傳回值可知,AbstractQuery、CriteriaQuery接口中的方法大部分是傳回其本身類型變量,可以了解為流式API的寫法。
回顧一下Specification中toPredicate方法的定義,代碼如下:
上述方法的第二個參數為CriteriaQuery類型,是以在建構Specification的執行個體(實作其toPredicate方法)時可以借助CriteriaQuery的能力,案例如下:
上述案例調用了CriteriaQuery的where以及orderBy方法以指定具體查詢條件,在return語句中調用了CriteriaQuery的getRestriction方法。
Note:
從前面類圖可知,getRestriction方法實際上是定義在CommonAbstractCriteria接口中,代碼如下:
CriteriaQuery與EntityManager
EntityManager定義在包路徑javax.persistence下,其中的一些方法如下圖所示:
EntityManager提供了衆多createQuery方法,其中一個createQuery方法可以接受CriteriaQuery類型的參數,該方法的定義如下:
上述代碼通過EntityManager的getCriteriaBuilder方法擷取了CriteriaBuilder類型的變量,進而建構了CriteriaQuery類型的變量,然後進一步利用CriteriaQuery中的from、where等方法指定查詢條件。
擴充閱讀
官方文檔[位址]
其它[位址]