Hibernate HQL Quest Подвыбирает или объединяет - PullRequest
0 голосов
/ 30 июня 2011

В настраиваемой платформе блога с пользователями, сообщениями и сообщениями.Я знаю, как сделать HQL-запрос с разными пользователями и их количеством сообщений.Также различаются пользователи и их количество сообщений.

Но если я объединю эти два с техникой "внутреннего соединения", я получу одинаковое количество сообщений и сообщений.Я понимаю, почему это происходит из-за соединений.Как я могу выполнить подвыборы в HQL, чтобы получить два счета как по отдельности, так и как одну поездку в базу данных?

Вот пример последнего запроса HQL, который я пробовал.1007 * Примечание: я буду менять порядок, отключив опцию на веб-странице.

1 Ответ

4 голосов
/ 30 июня 2011
select u.username,
       (select count(m.id) from Message m where m.user = u) as messageCount,
       (select count(p.id) from Post p where p.user = u) as postCount
from User u
order by messageCount desc

У вас могут быть проблемы с заказом из-за ошибки http://opensource.atlassian.com/projects/hibernate/browse/HHH-892, которая должна быть исправлена, но, похоже, ее нет в моей версии Hibernate.Если это так, замените order by messageCount на order by 2.

Но, как указывает Майкл Дж. Ли, вы также можете использовать простое объединение и отдельный счет, который должен быть более эффективным:

select u.username, count(distinct m.id), count(distinct p.id) from User u 
inner join u.messages m
inner join u.posts p
group by u.username)
order by (count(distinct m.id) desc

Использование левых объединений вместо внутренних объединений также позволит вам получать пользователей без постов или сообщений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...