我正在使用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"))));
上述查询不会返回正确的记录集。
答案 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"))));