NHibernate Как выбрать отдельные объекты на основе конкретного свойства, используя HQL? - PullRequest
0 голосов
/ 26 ноября 2009

Как можно использовать HQL для выбора конкретных объектов, соответствующих определенным критериям?

Мы попробовали следующее, чтобы сгенерировать список из десяти лучших подписанных RSS-каналов (где SubscriptionCount является производным свойством):

var topTen = UoW.Session.CreateQuery( @"SELECT distinct rss 
                                                 FROM RssFeedSubscription rss
                                                 group by rss.FeedUrl
                                                 order by rss.SubscriptionCount DESC
                                                 ")
.SetMaxResults(10)
.List<RssFeedSubscription>();

В тех случаях, когда намерение состоит только в том, чтобы выбрать два уникальных URL-адреса фида в базе данных, а не десять строк в базе данных, созданных в виде объектов. Результат вышеупомянутого:

Column 'RssSubscriptions.Id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
ORDER BY items must appear in the select list if SELECT DISTINCT is specified.

Можно просто прореживать результаты, чтобы мы убрали два уникальных URL-адреса фида после получения данных из базы данных, но должен быть способ сделать это на уровне БД с использованием HQL?

РЕДАКТИРОВАТЬ: Мы понимаем, что можно сделать скалярный запрос, а затем вручную извлекать значения, но нет ли способа просто указать критерии соответствия для откатанных объектов?

Ответы [ 3 ]

3 голосов
/ 26 ноября 2009

Если вы немного измените свой HQL, чтобы он выглядел так:

var topTen = UoW.Session.CreateQuery( @"SELECT distinct rss.FeedUrl
                                          FROM RssFeedSubscription rss
                                          group by rss.FeedUrl
                                          order by rss.SubscriptionCount DESC
                                        ")
.SetMaxResults(10)
.List();

переменная topTen будет объектом [] с двумя элементами, в которых есть 2 URL-адреса фида.

Вы можете получить это как строго типизированную коллекцию, если используете метод SetResultTransformer () интерфейса IQuery.

0 голосов
/ 26 ноября 2009

Вам необходимо выполнить скалярный запрос. Вот пример из документации NHibernate:

IEnumerable results = sess.Enumerable(
    "select cat.Color, min(cat.Birthdate), count(cat) from Cat cat " +
    "group by cat.Color"
);
foreach ( object[] row in results )
{
    Color type = (Color) row[0];
    DateTime oldest = (DateTime) row[1];
    int count = (int) row[2];
    .....
}
0 голосов
/ 26 ноября 2009

Это group by rss.FeedUrl, которая вызывает у вас проблему. Это не похоже на то, что вам нужно, так как вы выбираете сами сущности. Убери это, и я думаю, что ты будешь хорошим.

РЕДАКТИРОВАТЬ - Мои извинения Я не заметил часть о "производной собственности". Под этим я предполагаю, что вы имеете в виду, что это не свойство Hibernate-mapped и, следовательно, фактически не имеет столбца в таблице? Это объясняет второе сообщение об ошибке, которое вы получили в своем запросе. Возможно, вам также придется удалить предложение "order by" и выполнить сортировку в Java, если это так.

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