2011-08-09 11 views
5

Używam tego JPA-Query:Jak zamówić przez count() w JPA

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

otrzymuję żadnych błędów, a wyniki są klasyfikowane prawie poprawne, ale istnieją pewne wartości błędnych (albo dwie wartości są odwrócone lub niektóre pojedyncze wartości są całkowicie niesłuszna)

EDIT:

Dodawanie COUNT (e.label) do mojego klauzuli SELECT rozwiązuje ten problem dla tego zapytania.

Ale w podobnym zapytaniu, które zawiera również klauzulę, gdy problem nie ustępuje:

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

Czy jesteś pewien, że możesz przekazać parametr ': category' poprawnie jako parametr? Spróbuj umieścić żądany typ klasy bezpośrednio w SQL. – MicSim

+0

Przejście w ': category' działa poprawnie. –

Odpowiedz

12

może być konieczne włączenie COUNT(e.label) w klauzuli SELECT:

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

UPDATE: chodzi drugie zapytanie należy przeczytać w sekcji 8.6. Polymorphic queries dokumentacji EntityManager. Wygląda na to, że jeśli wykonasz zapytania w sposób, który wymaga wielu SELECT s, to ORDER BY nie będzie już działać. Używanie słowa kluczowego TYPE wydaje się być takim przypadkiem. Cytat z powyższego linku:


Następująca kwerenda zwróci listę wszystkich utrzymujących obiekty:

from java.lang.Object o // HQL only 

interfejsu o nazwie może być realizowane przez różne trwałych klas:

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

Zauważ, że te ostatnie dwa zapytania będą wymagały więcej niż jednego SQL SELECT. Oznacza to, że klauzula order by nie porządkuje całego zestawu wyników. (Oznacza to również nie można nazwać tych zapytań z wykorzystaniem Query.scroll()).


+0

To działało dla pierwszego zapytania, ale nie dla innego zapytania, które ma klauzulę "WHERE". –

-1

nie można zobaczyć, jak kolejność może być nieprawidłowe. Jaki jest nieprawidłowy wynik?

Co to jest wygenerowany kod SQL, jeśli spróbujesz tego samego kodu SQL bezpośrednio w bazie danych, czy ta sama kolejność jest niepoprawna?

Jaką bazę danych używasz?

Zawsze można sortować w Javie, zamiast używać sort().

+0

Nie sortowanie w Javie byłoby nieefektywne, ponieważ trzeba by wszystkie dane z bazy danych przenieść do pamięci Java? – exic

2

Z jakiegoś powodu dodaje styl nazwany kwerendy nie działa dla mnie:

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

To może być bo używam starej wersji Hibernate. Dostałem zamówienie, pracując, używając numeru, aby wybrać kolumnę do posortowania według następującego wzoru:

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