Nhibernate和not-exists查询

时间:2010-05-06 10:45:34

标签: nhibernate

我正在尝试在NHibernate中构建一个查询,以返回没有符合特定条件的订单的客户列表。

我的客户对象包含一组订单:

<set name="Orders">
    <key column="CustomerID" />
    <one-to-many class="Order" />
</set>

如何使用NHibernate的ICriteria API构建查询以获取所有没有订单的客户的列表?使用本机SQL,我能够像这样表示查询:

select * from tblCustomers c where not exists 
    (select 1 from tblOrders o where c.ID = o.CustomerID)

我一直无法弄清楚如何使用别名和DetatchedCriteria对象来做到这一点。任何指导将不胜感激!

谢谢!

1 个答案:

答案 0 :(得分:7)

这会转换为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>()