我正在努力在nHibernate查询中复制一个简单的sql left join。关于SO的其他答案让我更加困惑的是,在域查询中解决左连接的最聪明方法是什么。
示例:
2个数据库表:
Customer
CustId INT PK
Orders
OrderId INT PK
CustId INT FK
Status INT
1 SQL查询:
Select c.CustId from Customer c
left join Orders o on o.CustId = c.CustId and o.Status = 2
where o.OrderId is null
这将检索没有状态2订单的客户的唯一列表, 请注意,它还包括根本没有订单的客户。 这是一个简化这个问题的人为例子,但这种类型的查询非常有用,而且不容易做任何其他方式。
想象一下nh“客户”和“订单”的映射,它们只是反映了上面的示例表。
是否有一种简单的方法可以在查询中提取nHibernate中唯一的非状态2客户列表,而无需求助于SQL查询或最终选择n + 1场景?
查询首选项:
1 linq-to-nhibernate
2 QueryOver
3 HQL
4标准。
感谢。
答案 0 :(得分:2)
见http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/queryhql.html#queryhql-joins。它是Hibernate引用,而不是nHibernate引用,但我认为它们的工作方式相同(BTW,this post似乎证实了它):
您可以使用带有关键字的HQL提供额外的连接条件。
来自Cat作为猫 离开加入cat.kittens作为小猫 与kitten.bodyWeight> 10.0
因此,在您的情况下,它应该看起来像
select c.CustId from Customer c
left join Orders o with o.Status = 2
答案 1 :(得分:0)
如果实体不相关且您不希望映射关系,则可以使用theta连接。见here
也许像
Select c from Customer c, Order o
where o.CustId = c.CustId and o.Status = 2