【问题标题】:Hibernate HQL Query Subselects or JoinsHibernate HQL 查询子选择或连接
【发布时间】:2011-09-25 11:20:19
【问题描述】:

在包含用户、帖子和消息的自定义博客平台中。 我知道如何使用不同的用户及其帖子计数进行 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

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

【问题讨论】:

  • 在某些时候查看休眠投影以处理此类事情。另外,我不确定 HQL 是否会让你这样做,但你可以像在标准 sql 中那样执行 'count(distinct m.id)' 和 'count(distinct p.id)'。
  • 是的,我必须花更多时间研究 Projections。有了 C# LINQ 背景后,我仍在努力解决 LINQ 与 Hibernate 中的 Projections 之间的差异。为这个想法 +1

标签: java hibernate hql


【解决方案1】:
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,您可能对 order by 有疑问,但似乎不在我的 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

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

【讨论】:

  • 嗯。在这里遇到一个问题,即无论我使用 messageCount 还是 2,SQL 中都不会生成 ORDER BY。
  • 收回有错字。解决方法有效。 +1 并回答。
猜你喜欢
  • 2019-07-13
  • 2011-02-25
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多