2010-10-05 44 views
8

我使用的是JPA不同的投影得到一些数据:是否可以将COUNT与DISTINCT JPA投影一起使用?

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中执行不同的计数?](http://stackoverflow.com/questions/6197591/how-to-do-a-distinct-count-in-jpa-critera- api) – Arun 2013-03-01 17:44:54

回答

-2

你说你不想写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(); 
+0

There where子句相当复杂,并生成大量的SQL。我不想自己保持这一点。此外,我将拥有同一查询的两个版本,一个用于计数的SQL和一个用于读取一页行的EJBQL。 – 2010-10-05 15:25:38

+0

有没有JPQL存在的原因,以及为什么它通常建议通过本机SQL。使用getResultList()。size()如果你只想检索一些项目是没有意义的,笨拙的。 – 2012-12-20 16:16:41

0

试试这个:

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

为什么downvotes?这对我来说非常合适 – 2017-07-18 09:02:20

0

如果EclipseLink的和你的潜在DB允许子查询的尝试:

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

这样,你只需把你的JQL以计算其总体结果大小。

这适用于hibernate sql命名查询。我会很快尝试JP-QL的查询。

相关问题