HQL и группировка - PullRequest
       6

HQL и группировка

1 голос
/ 01 марта 2011

После многих проблем с использованием 'group by' в linq2nhibernate, я попытался перейти на HQL, но я борюсь с простым примером.

У меня следующая таблица (ForumThreadRatings):

Group by

Я хотел бы получить список тем с самым высоким рейтингом на форуме, что означает, что мне нужно сделать сумму с положительным столбцом и группой по теме форума.Я попытался в качестве примера просто сделать простую группу в 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 Ответ

2 голосов
/ 01 марта 2011

Из документов :

В настоящее время NHibernate не раскрывает сгруппированный объект, поэтому вы не можете написать group by cat, если все свойства cat не агрегированы.Вы должны перечислить все неагрегированные свойства явным образом.

В любом случае этот точный запрос может быть выполнен с помощью:

select distinct ftr.ForumThread from ForumThreadRating ftr

Но, конечно, вам, вероятно, нужно sum или count что-то, так что вам нужно явно агрегировать свойства.


Обновление: вот как получить топ-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 и т. Д.

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