2010-10-05 8 views
8

ich eine JPA verschiedene Projektion verwenden einige Daten zu erhalten:Kann COUNT mit einer DISTINCT JPA-Projektion verwendet werden?

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

Die mit setFirstResult und setMaxResults auf Seite Daten einwandfrei funktioniert.

Allerdings muss ich die Gesamtzahl der Zeilen zählen, ohne alle abzurufen. Ich habe versucht:

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

Dies funktioniert nicht (mit Eclipse sowieso) und es scheint nicht von der JPA-Spezifikation erlaubt zu werden. Gibt es eine andere Art und Weise? Ich möchte dazu keine SQL-Abfrage schreiben müssen.

+1

mögliche Duplikate von [Wie man eine eindeutige Zählung in JPA critera API?] (Http://stackoverflow.com/questions/6197591/how-to-do-a-distinct-count-in-jpa-critera- api) – Arun

Antwort

-2

Sie sagen, dass Sie keine SQL-Abfrage schreiben wollen, um dies zu tun, aber was ist der Unterschied zwischen JPA QL und SQL? Wenn Sie die Methode getResultList().size() nicht verwenden möchten, um die Anzahl der Gesamtzeilen zu ermitteln, verwenden Sie nur eine native SQL-Abfrage.

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

oder

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

Dort wo Klausel ist ziemlich komplex und generiert eine Menge von SQL. Ich möchte das nicht selbst aufrechterhalten müssen. Auch dann werde ich zwei Versionen derselben Abfrage haben, eine in SQL für die Zählung und eine EJBQL, um eine Seite von Zeilen zu holen. –

+0

Es gibt einen ruhigen Grund, warum JPQL existiert und warum es normalerweise über natives SQL empfohlen wird. Die Verwendung von getResultList(). Size(), wenn Sie nur die Anzahl der Elemente abrufen möchten, ist nicht effektiv und schwerfällig. –

0

Try this:

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

Warum die Downvotes? Das hat perfekt für mich funktioniert –

0

Wenn Eclipse und die zugrunde liegende DB erlauben Subselects versuchen:

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

Auf diese Weise Ihren einfach Ihre JQL setzen können um die Gesamtergebnisgröße zu zählen.

Dies funktioniert für Hibernate SQL-Abfragen. Ich werde es bald auf JP-QL-Abfragen versuchen.