我正在为我的系统中的实体实现“高级搜索”类功能,以便用户可以使用多个条件(例如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