如何使用 CriteriaQuery 生成“select count(*) ...”

Posted

技术标签:

【中文标题】如何使用 CriteriaQuery 生成“select count(*) ...”【英文标题】:How to generate "select count(*) ..." using CriteriaQuery 【发布时间】:2016-05-03 19:16:33 【问题描述】:

我编写了以下代码来获取“ExampleEntity”的计数:

cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
root = cq.from(ExampleEntity);
cq.select(cb.count(root));
return entityManager.createQuery(cq).getSingleResult();

生成的 sql: 休眠:从EXAMPLEENTITY exampleen0_

中选择count(exampleen0_.id) as col_0_0_

但是,出于性能原因(使用Oracle 11g数据库),我需要生成以下sql:

所需的 sql: select count(*) as col_0_0_ from EXAMPLEENTITY exampleen0_

创建 JPQL 查询非常简单,但我必须为过滤器重写大量现有代码。

如何使用 CriteriaQuery 生成“count(*)”而不是“count(exampleen0_.id)”?

【问题讨论】:

【参考方案1】:

强行使用 Hibernate 生成的 SQL 非常困难。相反,我会考虑编写本机查询。

Query query = entityManager.createNativeQuery(
        "SELECT COUNT(*) FROM EXAMPLEENTITY", Long.class);
return query.getSingleResult();

注意:当使用更复杂的逻辑时,本机查询可能会变得混乱,但这个特定的查询符合 ANSI 标准,并且应该针对任何常用数据库运行而无需担心任何 db-具体语法问题。

【讨论】:

正确,这是一个替代方案,就像 jpql 查询一样......但正如我在描述中所说,我将不得不重写很多现有的过滤代码【参考方案2】:

它适用于 Oracle...

BigDecimal count = (BigDecimal) manager.createNativeQuery(query).getSingleResult();

【讨论】:

以上是关于如何使用 CriteriaQuery 生成“select count(*) ...”的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JPA 调整为 Criteriaquery

如何在具有枚举字段的实体上使用 JPA CriteriaQuery 填充 DTO 类字符串字段?

日期之间的 JPA 2.1 CriteriaQuery

JPA 2 CriteriaQuery,使用限制

CriteriaQuery 设置可缓存

CriteriaQuery 多选 - 运行时构造函数错误