Справка по запросам критериев NHibernate - PullRequest
0 голосов
/ 15 декабря 2010

Я использую NHibernate, и я требую, чтобы у меня было 2 таблицы: Пользователь и Билет. Мне нужны все записи, которые есть у пользователя, но не в билете. Таблица заявок имеет идентификатор пользователя в качестве ссылочного ключа для идентификатора первичного ключа таблицы пользователя. Ниже мой код,

 RegNotTickTemplate.Criteria = DetachedCriteria.For(typeof(User));
            RegNotTickTemplate.Criteria.Add(Subqueries.PropertyNotIn("ID",DetachedCriteria.For(typeof(Ticket))
                .SetProjection(Projections.Property("UserID"))));

Приведенный выше запрос не возвращает правильный набор записей.

Ответы [ 2 ]

0 голосов
/ 27 июня 2012

Чего вам не хватает: количество билетов для этого пользователя должно быть больше нуля.Вот как вы можете это реализовать:

RegNotTickTemplate.Criteria = DetachedCriteria.For(typeof(User));
RegNotTickTemplate.Criteria.Add(Subqueries.PropertyIn("Id",
          DetachedCriteria.For<Ticket>()
            .SetProjection(Projections.GroupProperty("User"))
            .Add(Restrictions.Eq(Projections.RowCount(), 0))));

Если вам не нужно количество строк, вы можете сделать следующее:

RegNotTickTemplate.Criteria = DetachedCriteria.For(typeof(User),"user");
RegNotTickTemplate.Criteria.Add(Subqueries.Exists(DetachedCriteria.For<Ticket>("ticket")
            .SetProjection(Projections.Property("User"))
            .Add(Restrictions.EqProperty("user.Id", "User"))));
0 голосов
/ 16 декабря 2010

В качестве альтернативы вы можете попробовать использовать HQL.Я никогда не использую Критерии, так как нахожу HQL более читабельным (это почти то же самое, что и SQL, за исключением того, что вы получаете запрос на основе сущностей, а не таблиц).

Глава 13. HQL: запрос HibernateЯзык

IQuery query = Session.CreateQuery(
       "from User where Id not in (select UserId from Ticket)");
       query.List<User>();

Если это не помогло, вы всегда можете выполнить SQL-запрос

ISQLQuery query = Session.CreateSQLQuery(sql);
...