【问题标题】:Nhibernate and not-exists query休眠和不存在查询
【发布时间】:2011-02-16 08:23:21
【问题描述】:

我正在尝试在 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 对象来做到这一点。任何指导将不胜感激!

谢谢!

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    这将转化为那个 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 会抱怨使用 o.CustomerID... 该列在数据库中,但未映射为我的 Order 类中的列。 (NHibernate 自动将其添加为客户设置中指定的键列。)
    • 两个实体是否必须相互映射才能使一切正常运行?因为目前我无法输入语句,即使智能感知也不会突出显示它。
    • 刚刚得到它,非常感谢,真的为我节省了数小时的搜索时间。
    • +1 我几乎创建了一个带有别名的粗糙分离子查询,因为我的查询是运行时动态的,幸好通过优雅的 Restrictions.IsEmpty 避免了这种情况!
    猜你喜欢
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 2011-08-09
    • 2011-03-07
    相关资源
    最近更新 更多