使用DISTINCT JPA投影,是否可以使用COUNT?

23

我正在使用 JPA 的 distinct 投影来获取一些数据:

select distinct o.f1, o.f2, o.f3 from SomeEntity o where ...

使用setFirstResult和setMaxResults分页数据的操作是正常的。

但是我需要在不获取所有行的情况下计算总行数。我尝试过:

select count(distinct o.f1, o.f2, o.f3) from SomeEntity o where ...

这种方法不起作用(至少在 EclipseLink 中是这样),而且 JPA 规范似乎也不允许这样做。有其他的方法吗?我不想编写 SQL 查询来实现这个功能。


1
可能是如何在JPA critera API中执行不同的计数?的重复问题。 - Arun
4个回答

31

试试这个:

select count(distinct o) from SomeEntity o where ...

3
只需小心不要使用count(distinct(o)) - 多余的括号是一个错误。 - xtian

0
如果EclipseLink和底层数据库允许子查询,请尝试:
select count(*) from (select distinct o.f1, o.f2, o.f3 from SomeEntity o where ... )

这样你就可以直接将JQL放入其中以计算其总结果大小。

这适用于Hibernate SQL命名查询。我很快会在JP-QL查询上尝试它。


-1
虽然这个答案来得有点晚,但它可能会帮助未来的人们。 在你的代码库中, 这对我自己的情况有效。 @Query("SELECT DISTINCT COUNT(o.f1, o.f2...) FROM SomeEntity o WHERE....) 希望能帮到其他人。

我认为它只区分计数数字,而不是列值。 - Shakirov Ramil

-5

你说你不想写一个SQL查询来完成这个任务,但是JPA QL和SQL有什么区别呢?如果你不想使用getResultList().size()方法来确定总行数,那么唯一的方法就是使用本地SQL查询。

entityManager.createNativeQuery("select count(distinct o.f1, o.f2, o.f3) from SomeEntity o where ...").getSingleResult();

或者

entityManager.createQuery("select distinct o.f1, o.f2, o.f3 from SomeEntity o where ...").getResultList().size();

"where"子句相当复杂,会生成大量的SQL语句。我不想自己维护它。此外,我将有两个版本的相同查询,一个是用于计数的SQL,另一个是用于获取一页行的EJBQL。 - David Tinker
JPQL存在的原因是相当充分的,通常比本地SQL更受推荐。如果您只想检索项目数量,则使用getResultList().size()是无效和笨拙的。 - Ondrej Bozek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接