2010-10-05 87 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的查詢。

相關問題