java - 使用 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();

我的结果集可能很大,所以我不想加载我的实体进行计数查询,所以请告诉我获取总计数的有效方法,例如 Criteria 上的 rowCount() 方法(我认为它在 Hibernate 的标准中)。

最佳答案

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

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);

让它工作。有什么想法吗?

https://stackoverflow.com/questions/5349264/

相关文章:

string - 字符串中的美元符号字符

kotlin - 如何在 Kotlin 中克隆对象?

java - Kotlin 文件是否应该放在 Android 中的单独源目录中?

java - Smartcast 是不可能的,因为属性有开放的或自定义的 getter

intellij-idea - 为什么 IntelliJ 建议将调用链转换为序列?

kotlin - 带有 T.() 的 Kotlin 函数签名是什么意思?

android - 带有命名参数的 Kotlin 中的 Dagger 2 构造函数注入(inject

java - isInitialized - lateinit var 的支持字段此时不可访问

kotlin - 如何使用 Gradle Kotlin 脚本创建胖 JAR?

arrays - Kotlin:For 循环必须有一个迭代器方法——这是一个错误吗?