Nhibernate 和不存在的查询

标签 nhibernate

我正在尝试在 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/

相关文章:

nhibernate - 对子类的 HQL 查询

c# - NHibernate Criteria QueryByExample 卡在中间的 SQL

linq - NHibernate LINQ 查询抛出错误 "Could not resolve property"

c# - 如何使用 MySQL 配置流畅的 nHibernate

c# - nHibernate ICriteria 按多对多属性最小值排序

c# - NHibernate:更新与合并方法

nhibernate - 在 NHibernate、Fluent NHibernate 和 SQL Server 2008 中使用时间列

nhibernate - 流利的 NHibernate : foreign key field not being set in unidirectional association

c# - 对 NHibernate 中一对一映射的困惑

nhibernate - 枚举到整数的映射导致每次刷新时都会更新