使用JPA Criteria API进行分页的总行数

我正在为我的系统中的实体实现“高级搜索”类功能,以便用户可以使用对该实体属性的多个条件(eq,ne,gt,lt,like等)来搜索该实体。我正在使用JPA的Criteria

API动态生成Criteria查询,然后使用setFirstResult()setMaxResults()支持分页。到现在为止一切都很好,但是现在我想在结果网格上显示结果总数,但是我没有看到直接获取Criteria查询总数的直接方法。

这是我的代码的样子:

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()Criteria中的方法(我认为它在Hibernate的Criteria中就存在)。

回答:

谢谢弗拉基米尔!我接受了您的想法,并使用了单独的计数查询来在其中使用现有的谓词数组。最终实现如下所示:

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**

.

.

CriteriaQuery<Long> cq = builder.createQuery(Long.class);

cq.select(builder.count(cq.from(Brand.class)));

// Following line if commented causes [org.hibernate.hql.ast.QuerySyntaxException: Invalid path: 'generatedAlias1.enabled' [select count(generatedAlias0) from xxx.yyy.zzz.Brand as generatedAlias0 where ( generatedAlias1.enabled=:param0 ) and ( lower(generatedAlias1.description) like :param1 )]]

em.createQuery(cq);

cq.where(pArray);

Long count = em.createQuery(cq).getSingleResult();

.

.

select.where(pArray);

.

.

// Added orderBy clause

TypedQuery typedQuery = em.createQuery(select);

typedQuery.setFirstResult(startIndex);

typedQuery.setMaxResults(pageSize);

List resultList = typedQuery.getResultList()

尽管这很好,但是我仍然不确定为什么我必须写

em.createQuery(cq);

使它工作。任何的想法?

以上是 使用JPA Criteria API进行分页的总行数 的全部内容, 来源链接: utcz.com/qa/429997.html

回到顶部