HQL和分组

时间:2011-03-01 17:19:20

标签: nhibernate hql

在linq2nhibernate中使用'group by'后遇到很多问题,我试图切换到HQL,但我只想用一个简单的例子。

我有下表(ForumThreadRatings):

Group by

我想检索一个评价最高的论坛帖子的列表,这意味着我需要通过forumthread与积极列和组进行总结。我试过一个例子,只是在HQL中做一个简单的小组而没有运气:

select ftr.ForumThread from ForumThreadRating ftr group by ftr.ForumThread

但是我收到以下错误:

Column 'ForumThreads.Id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

我可能会遗失什么?

1 个答案:

答案 0 :(得分:2)

来自the docs

  

NHibernate目前不扩展分组实体,因此如果cat的所有属性都是非聚合的,则无法编写group by cat。您必须明确列出所有非聚合属性。

在任何情况下,确切的查询都可以通过以下方式完成:

select distinct ftr.ForumThread from ForumThreadRating ftr

但当然您可能需要sumcount某些内容,因此您需要明确地汇总属性。


更新:这里是如何获得前10个主题:

var topThreads = session.CreateQuery(@"
                 select (select sum(case
                                      when rating.Positive = true then 1
                                      else -1
                                    end)
                         from ForumThreadRating rating
                         where rating.ForumThread = thread),
                        thread
                 from ForumThread thread
                 order by 1 desc
                 ")
                 .SetMaxResults(10)
                 .List<object[]>()

如您所见,此查询返回object[]列表,每个列表包含两个元素:[0]是评级,[1]是ForumThread。

您可以使用以下方式获取ForumThreads:

.Select(x => (ForumThread)x[1]);

或者将它们投射到DTO等等。