我正在尝试在 NHibernate 中构建一个查询,以返回没有符合特定条件的订单的客户列表。
我的客户对象包含一组订单:
<set name="Orders">
<key column="CustomerID" />
<one-to-many class="Order" />
</set>
如何使用 NHibernate 的 ICriteria API 构造查询以获取所有没有订单的客户的列表?使用 native SQL,我可以像这样表示查询:
select * from tblCustomers c where not exists
(select 1 from tblOrders o where c.ID = o.CustomerID)
我一直无法弄清楚如何使用别名和 DetatchedCriteria 对象来做到这一点。任何指导将不胜感激!
谢谢!
最佳答案
这将转化为那个 sql ...
session.CreateCriteria<Customer>("c")
.Add(Subqueries.NotExists(
DetachedCriteria.For<Order>("o")
.SetProjection(Projections.Constant(1))
.Add(Restrictions.PropertyEq("c.ID", "o.Customer.ID"))
//Add more order restricitions here
))
.List<Customer>();
如果您只想要没有订单的客户,您也可以使用
Restrictions.IsEmpty()
做与上面完全相同的事情。session.CreateCriteria<Customer>()
.Add(Restrictions.IsEmpty("Orders"))
.List<Customer>()
关于Nhibernate 和不存在的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2780430/