Справка по подзапросу NHibernate Criteria

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

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

Вышеупомянутый запрос не возвращает правильный набор записей.


person developer    schedule 15.12.2010    source источник
comment
Я использовал этот тип подзапроса бесчисленное количество раз, я не вижу чего-то неправильного ... может быть, опубликовать дополнительную информацию, может быть, даже сгенерированный sql?   -  person Jaguar    schedule 16.12.2010


Ответы (2)


В качестве альтернативы вы можете попробовать использовать 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);
person i8abug    schedule 15.12.2010
comment
Я бы действительно хотел использовать Criteria Query, поскольку именно так приложение настроено для работы. Любая помощь с этим была бы замечательной .. - person developer; 16.12.2010

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

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"))));
person Manar Husrieh    schedule 27.06.2012