2010-10-05 40 views
8

estoy usando una proyección distinta de la APP para obtener algunos datos:¿Es posible usar COUNT con una proyección DISTINCT JPA?

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

Esto funciona bien con setFirstResult y setMaxResults de datos de la página.

Sin embargo, necesito contar el número total de filas sin obtener todas. He tratado:

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

Esto no funciona (con EclipseLink todos modos) y no parece estar permitido por la especificación JPA. ¿Hay otra manera? No quiero tener que escribir una consulta SQL para hacer esto.

+1

posible duplicado de [¿Cómo hacer un recuento distinto en la API critera JPA?] (Http://stackoverflow.com/questions/6197591/how-to-do-a-distinct-count-in-jpa-critera- api) – Arun

Respuesta

-2

Usted dice que no desea escribir una consulta SQL para hacer esto, pero ¿cuál es la diferencia entre JPA QL y SQL? Si no desea utilizar el método getResultList().size() para determinar el número de filas totales, entonces la única forma es usar una consulta 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

There where cláusula es bastante compleja y genera una gran cantidad de SQL. No quiero tener que mantener eso yo mismo. Además, tendré dos versiones de la misma consulta, una en SQL para el recuento y otra en EJBQL para buscar una página de filas. –

+0

Existe una razón tranquila de por qué existe JPQL y por qué generalmente se recomienda sobre SQL nativo. El uso de getResultList(). Size() si solo desea recuperar el número de elementos no es efectivo ni es torpe. –

0

Prueba esto:

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

¿Por qué los votos a favor? Esto funcionó perfectamente para mí –

0

Si EclipseLink y su subyacente DB permiten subselects tratan:

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

De esa manera su simplemente puede poner su JQL para contar su tamaño de resultado total.

Esto funciona para las consultas con nombre de sql de hibernación. Lo intentaré en consultas JP-QL pronto.

Cuestiones relacionadas