NHibernate Criteria子查询帮助

时间:2010-12-15 20:42:36

标签: nhibernate nhibernate-criteria

我正在使用NHibernate,我的要求是我有2个表,User和Ticket。我想要用户但不在Ticket中的所有记录。 Ticket表具有UserId作为User表的主键ID的引用键。以下是我的代码,

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

上述查询不会返回正确的记录集。

2 个答案:

答案 0 :(得分:0)

作为替代方案,您可以尝试使用HQL。我从不使用Criteria,因为我发现HQL更具可读性(除了基于实体而不是表格进行查询之外,它几乎与SQL相同)。

Chapter 13. HQL: The Hibernate Query Language

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

如果仍然不行,您可以随时进行SQL查询

ISQLQuery query = Session.CreateSQLQuery(sql);

答案 1 :(得分:0)

您缺少的是:此用户的门票数量应大于零。以下是如何实现它:

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"))));