在nHibernate查询中与左连接斗争

时间:2011-11-29 11:00:42

标签: nhibernate hql linq-to-nhibernate queryover

我正在努力在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标准。

感谢。

2 个答案:

答案 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