Как сделать заказ по count () в JPA - PullRequest
7 голосов
/ 09 августа 2011

Я использую этот JPA-запрос:

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

Я не получаю ошибок и результаты сортируются почти правильно, но некоторые значения неверны (либо два значения перевернуты, либо некоторые отдельные значения полностью смещены)

EDIT:

Добавление COUNT (e.label) в мое предложение SELECT решает эту проблему для этого запроса.

Но в аналогичном запросе, который также содержит предложение WHERE, проблема сохраняется:

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

Ответы [ 3 ]

12 голосов
/ 09 августа 2011

Возможно, вам потребуется включить COUNT(e.label) в ваше предложение SELECT:

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

ОБНОВЛЕНИЕ: Относительно второго запроса, пожалуйста, прочитайте раздел 8.6. Полиморфные запросы документации EntityManager. Похоже, что если вы делаете запросы так, что требуется несколько SELECT с, то ORDER BY больше не будет работать. Использование ключевого слова TYPE похоже на такой случай. Цитата из ссылки выше:

<ч /> Следующий запрос вернет все постоянные объекты:

from java.lang.Object o // HQL only

Именованный интерфейс может быть реализован различными постоянными классами:

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

Обратите внимание, что для этих двух последних запросов потребуется более одного SQL SELECT. Это означает, что предложение order by некорректно упорядочивает весь набор результатов. (Это также означает, что вы не можете вызывать эти запросы, используя Query.scroll ().)

<Ч />
2 голосов
/ 18 января 2012

По какой-то причине следующий стиль с именем query у меня не работал:

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

Это может быть потому, что я использую старую версию Hibernate.Я получил заказ, используя номер, чтобы выбрать столбец для сортировки следующим образом:

SELECT DISTINCT e.label, COUNT(e.label) 
FROM Entity e 
GROUP BY e.label 
ORDER BY 2 DESC
0 голосов
/ 10 августа 2011

Не вижу, как порядок может быть неправильным. Что за неверный результат?

Что такое генерируемый SQL, если вы пытаетесь использовать тот же SQL непосредственно в базе данных, дает ли он тот же неправильный порядок?

Какую базу данных вы используете?

Вы всегда можете отсортировать в Java вместо использования sort ().

...