2011-08-09 8 views
5

estoy usando este JPA-consulta:Cómo realizar un pedido por recuento() en JPA

SELECT DISTINCT e.label FROM Entity e 
GROUP BY e.label 
ORDER BY COUNT(e.label) DESC 

me sale ningún error y los resultados se ordenan casi correcta, pero hay algunos valores incorrectos (ya sea dos valores se da la vuelta o algunos valores individuales están fuera de lugar completamente)

EDIT:

Adición de COUNT (e.label) a mi cláusula SELECT resuelve este problema para esta consulta.

Pero en una consulta similar que también contiene una cláusula donde el problema persiste:

SELECT DISTINCT e.label, COUNT(e.label) FROM Entity e 
WHERE TYPE(e.cat) = :category 
GROUP BY e.label 
ORDER BY COUNT(e.label) DESC 
+0

¿Está seguro de que puede pasar el parámetro ': category' correctamente como parámetro? Trate de poner el tipo de clase deseado directamente en el SQL. – MicSim

+0

Pasar en ': category' funciona bien. –

Respuesta

12

Puede que sea necesario para incluir el COUNT(e.label) en su cláusula SELECT:

SELECT DISTINCT e.label, COUNT(e.label) 
FROM Entity e 
GROUP BY e.label 
ORDER BY COUNT(e.label) DESC 

ACTUALIZACIÓN: Con respecto En la segunda consulta, lea la sección 8.6. Polymorphic queries de la documentación de EntityManager. Parece que si realiza sus consultas de una manera que requiere múltiples SELECT s, entonces el ORDER BY ya no funcionará. El uso de la palabra clave TYPE parece ser un caso así. Una cita del foro:


La siguiente consulta devolver todos los objetos persistentes:

from java.lang.Object o // HQL only 

La interfaz llamada podría ser implementado por diversas clases persistentes:

from Named n, Named m where n.name = m.name // HQL only 

en cuenta que estos las dos últimas consultas requerirán más de un SQL SELECT. Esto significa que la cláusula order by no ordena correctamente el conjunto de resultados completo. (También significa que no puede llamar a estas consultas utilizando Query.scroll().)


+0

Esto funcionó para la primera consulta, pero no para otra consulta, que tiene una cláusula 'WHERE'. –

-1

No se puede ver cómo el orden podría ser incorrecta. ¿Cuál es el resultado incorrecto?

¿Cuál es el SQL que se genera, si prueba el mismo SQL directamente en la base de datos, da el mismo orden incorrecto?

¿Qué base de datos está utilizando?

Siempre se puede ordenar en Java utilizando sort().

+0

¿No sería ineficaz ordenar en Java, ya que tendría que obtener todos los datos de la base de datos en la memoria Java? – exic

2

Por alguna razón el estilo siguiente consulta con nombre no funcionó para mí:

SELECT DISTINCT e.label, COUNT(e.label) 
FROM Entity e 
GROUP BY e.label 
ORDER BY COUNT(e.label) DESC 

Podría ser porque estoy utilizando una versión antigua de hibernación. Obtuve el orden trabajando usando un número para elegir la columna para ordenar de esta manera:

SELECT DISTINCT e.label, COUNT(e.label) 
FROM Entity e 
GROUP BY e.label 
ORDER BY 2 DESC 
Cuestiones relacionadas