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
Использование левых объединений вместо внутренних объединений также позволит вам получать пользователей без постов или сообщений.