1

我编写了以下代码来获取“ 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)作为col_0_0_

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

所需的sql:从EXAMPLEENTITY exampleen0_中选择count(*)作为col_0_0_

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

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

4

2 回答 2

0

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

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

注意:当使用更复杂的逻辑时,本机查询可能会变得混乱,但是这个特定的查询符合 ANSI 标准,并且应该针对任何常用的 DB 运行而不会出现任何问题,而不必担心任何特定于 db 的语法问题。

于 2016-05-03T19:52:26.623 回答
0

它适用于甲骨文...

BigDecimal count = (BigDecimal) manager.createNativeQuery(query).getSingleResult();
于 2016-09-27T15:56:20.610 回答