如何使用 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(*) ...”的主要内容,如果未能解决你的问题,请参考以下文章