2010-10-05 15 views
8

Sto usando una proiezione distinta APP a ottenere alcuni dati:È possibile utilizzare COUNT con una proiezione DISTINCT JPA?

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

Questo funziona bene con setFirstResult e setMaxResults ai dati della pagina.

Tuttavia, ho bisogno di contare il numero totale di righe senza recuperarle tutte. Ho provato:

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

Questo non funziona (con EclipseLink comunque) e non sembra essere consentita dalle specifiche JPA. C'è un altro modo? Non voglio dover scrivere una query SQL per farlo.

+1

possibile duplicato di [Come eseguire un conteggio distinto in API Critera JPA?] (Http://stackoverflow.com/questions/6197591/how-to-do-a-distinct-count-in-jpa-critera- api) – Arun

risposta

-2

Si dice di non voler scrivere una query SQL per farlo, ma qual è la differenza tra JPA QL e SQL? Se non si desidera utilizzare il metodo getResultList().size() per determinare il numero di righe totali, l'unico modo è utilizzare una query sql nativa.

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

o

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

Là dove clausola è abbastanza complessa e genera un sacco di SQL. Non voglio doverlo mantenere da solo. Inoltre, avrò due versioni della stessa query, una in SQL per il conteggio e una EJBQL per il recupero di una pagina di righe. –

+0

C'è un motivo per cui JPQL esiste e perché viene solitamente consigliato su SQL nativo. L'uso di getResultList(). Size() se si desidera solo recuperare il numero di elementi è imperativo e impacciato. –

0

Prova questo:

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

Perché i downvotes? Ha funzionato perfettamente per me –

0

Se EclipseLink e la vostra sottostante DB permettono subselect cercano:

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

In questo modo il vostro può semplicemente mettere il vostro JQL per contare la sua dimensione totale del risultato.

Questo funziona per le query con nome sql in ibernazione. Proverò presto le query JP-QL.

Problemi correlati