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

StackOverflow https://stackoverflow.com/questions/1800289

  •  05-07-2019
  •  | 
  •  

Вопрос

Как можно использовать 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?

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

Это было полезно?

Решение

Если вы немного измените свой 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 будет объектом [] с двумя элементами, в которых есть два URL-адреса фида.

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

Другие советы

Вам необходимо выполнить скалярный запрос. Вот пример из документации 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];
    .....
}

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top