HQL-версия SQL-соединения с группой - PullRequest
6 голосов
/ 04 августа 2010

У меня есть две таблицы: группа и голоса. Band имеет имя и идентификатор, а Votes имеет столбец total_votes и внешний ключ band_id, указывающий на band.id.

У меня много голосов, сохраненных на разные даты. Что я хочу сделать, это найти максимальное значение столбца total_votes для каждой группы. Следующий SQL-запрос работает:

select b.name,max(v.total_votes) as total from band b, votes v 
    where b.id=v.band_id
    group by b.name order by total desc;

Система, с которой я работаю, использует Hibernate. Я хотел бы переписать этот SQL-запрос как HQL или запрос критериев Hibernate.

Это легко, и я просто скучаю по нему? Спасибо за любую помощь.

1 Ответ

12 голосов
/ 04 августа 2010

В HQL, не могли бы вы попробовать:

select band.name, max(vote.totalVotes)
from Band band
     join band.votes vote
group by band.name
order by max(vote.totalVotes) desc

Предполагается, что существует связь один-ко-многим между Band и Votes (на самом деле, предоставление объектной модели очень полезно при работе с HQL и / или Criteria API, поскольку вы запрашиваете объектную модель) .

На всякий случай, вот соответствующий раздел документации:

14,12. Сгруппировать по пункту

Запрос, который возвращает агрегированные значения может быть сгруппирован по любому свойству возвращаемый класс или компоненты:

select cat.color, sum(cat.weight), count(cat)
from Cat cat
group by cat.color

select foo.id, avg(name), max(name)
from Foo foo join foo.names name
group by foo.id

Допускается также наличие пункта.

select cat.color, sum(cat.weight), count(cat)
from Cat cat
group by cat.color
having cat.color in (eg.Color.TABBY, eg.Color.BLACK)

Функции SQL и агрегатные функции разрешены в порядке и порядке пункты, если они поддерживаются базовая база данных (т.е. не в MySQL).

select cat
from Cat cat
    join cat.kittens kitten
group by cat.id, cat.name, cat.other, cat.properties
having avg(kitten.weight) > 100
order by count(kitten) asc, sum(kitten.weight) desc

Ни по группам, ни по порядок по предложению может содержать арифметику выражения. Hibernate также не в настоящее время разверните сгруппированный объект, так Вы не можете написать группу по кошке, если все свойства кота неагрегированы. Вы должны перечислить все неагрегированные свойства явно.

...