Hibernate HQL查询子选择或连接

时间:2011-06-29 20:00:35

标签: java hibernate hql

在包含用户,帖子和消息的自定义博客平台中。 我知道如何使用不同的用户及其帖子计数进行HQL查询。同样不同的用户及其消息计数。

但如果我将两者结合起来使用“内连接”技术,我会得到相同的帖子和消息数。我理解为什么会因为连接而发生这种情况。我如何在HQL中进行子选择以将两个计数分开,但作为一次数据库之旅?

以下是我尝试过的最后一个HQL查询的示例。

   select u.username, count(m), count(p) from User as u 
   inner join u.Messages as m
   inner join u.Posts as p
   group by u.id 
   order by count(m) desc

注意:我将根据网页上的选项更改订单。

1 个答案:

答案 0 :(得分:4)

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

但是,正如Michael J. Lee指出的那样,你也可以使用简单的连接和不同的计数,这应该更有效:

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

使用左连接而不是内部连接也可以让您在没有任何帖子或没有任何消息的情况下获得用户。