我正在爲我的系統中的實體實現「高級搜索」類功能,以便用戶可以使用多個條件(例如eq,ne,gt,lt等)來搜索該實體。關於這個實體的屬性。我使用JPA的Criteria API動態生成Criteria查詢,然後使用setFirstResult()
& setMaxResults()
來支持分頁。直到這一點都一切正常,但現在我想顯示結果網格上的結果總數,但我沒有看到一個簡單的方法來獲得標準查詢的總數。
這是我的代碼看起來像:使用JPA Criteria API進行分頁的總行數
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Brand> cQuery = builder.createQuery(Brand.class);
Root<Brand> from = cQuery.from(Brand.class);
CriteriaQuery<Brand> select = cQuery.select(from);
.
.
//Created many predicates and added to **Predicate[] pArray**
.
.
select.where(pArray);
// Added orderBy clause
TypedQuery typedQuery = em.createQuery(select);
typedQuery.setFirstResult(startIndex);
typedQuery.setMaxResults(pageSize);
List resultList = typedQuery.getResultList();
我的結果集可能是大的,所以我不希望加載我對數查詢實體,所以告訴我有效的方式來獲得總數像rowCount()
方法上標準(我認爲它存在於Hibernate的標準中)。
您是否能夠找出爲什麼您需要添加'em.createQuery(cq);'?謝謝 – Ittai 2011-12-22 07:01:32
嘿,這正是我所需要的......我也想知道爲什麼這條線是必要的!? – 2013-02-28 14:15:44
我懷疑這是因爲'Predicate's正在使用來自= cQuery.from(Brand.class)的'Root'這個部分的'Root <>'來構建,然後被用於這兩個計數查詢和分頁查詢。 AFAIK你需要使用'Root <>'對象兩次建立謂詞。第二個隱藏在這行'cq.select(builder.count(cq.from(Brand.class)));'中。爲什麼'em.createQuery(cq);'我不知道,IMO應該拋出一個異常。 –
Neilos
2017-11-09 22:43:43