在nHibernate查询中挣扎于左连接
我正在努力在nHibernate查询中复制一个简单的sql左连接。其他答案让我更加困惑,在域查询中处理左连接最聪明的方法是什么 例如: 2数据库表:在nHibernate查询中挣扎于左连接,nhibernate,hql,linq-to-nhibernate,queryover,Nhibernate,Hql,Linq To Nhibernate,Queryover,我正在努力在nHibernate查询中复制一个简单的sql左连接。其他答案让我更加困惑,在域查询中处理左连接最聪明的方法是什么 例如: 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
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下没有订单的客户的唯一列表,
注意,它还包括根本没有订单的客户。
这是一个人为的例子来简化这个问题,但是这种类型的查询非常有用,并且不容易用其他方法来完成
想象一下“Customer”和“Orders”的nh映射,它们只是反映了上面的示例表
有没有一种简单的方法可以在查询中提取nHibernate中唯一的、非状态2的客户列表,而无需求助于SQL查询或最终选择n+1方案
查询首选项:
1 linq到nhibernate2查询版本
3 HQL
4标准 谢谢。请参阅。这是Hibernate引用,而不是nHibernate引用,但我假设它们的工作原理相同(顺便说一句,似乎证实了这一点): 您可以使用HQL with关键字提供额外的连接条件 从猫变成猫 左图:加入猫。小猫为小猫 带小猫。体重>10.0 所以,在你的情况下,它应该是
select c.CustId from Customer c
left join Orders o with o.Status = 2
看。这是Hibernate引用,而不是nHibernate引用,但我假设它们的工作原理相同(顺便说一句,似乎证实了这一点):
您可以使用HQL with关键字提供额外的连接条件
从猫变成猫
左图:加入猫。小猫为小猫
带小猫。体重>10.0
所以,在你的情况下,它应该是
select c.CustId from Customer c
left join Orders o with o.Status = 2
如果实体不相关,并且您不希望映射关系,则可以使用θ连接。看 也许像
Select c from Customer c, Order o
where o.CustId = c.CustId and o.Status = 2
如果实体不相关,并且您不希望映射关系,则可以使用θ连接。看 也许像
Select c from Customer c, Order o
where o.CustId = c.CustId and o.Status = 2
NHibernate 3.0为ICriteria.CreateAlias提供了一个重载方法,该方法使用4个参数,最后一个参数是withClause 以下是一个例子:
DetachedCriteria criteria = DetachedCriteria.For<Models.BO.Customer>("customer")
.CreateAlias(ReflectionHelper.PropertyName<Models.BO.Customer>(x => ((Models.BO.Interfaces.ICustomerQueryOnly) x).Tasks),
"activeTasks", JoinType.LeftOuterJoin, Restrictions.IsNotNull("activeTasks.LockedBy")
)
.CreateAlias(ReflectionHelper.PropertyName<Models.BO.Customer>(x => ((Models.BO.Interfaces.ICustomerQueryOnly) x).Tasks2),
"availableTasks", JoinType.LeftOuterJoin,
availableTasksRestraction
)
.Add(Restrictions.Eq("CustomerBase", _customerBase))
.Add(Restrictions.Eq("IsActive", true));
在本例中,我需要提取所有客户以及每个客户的可用任务数和活动任务数 NHibernate 3.0为ICriteria.CreateAlias提供了一个重载方法,该方法使用4个参数,最后一个参数是withClause 以下是一个例子:
DetachedCriteria criteria = DetachedCriteria.For<Models.BO.Customer>("customer")
.CreateAlias(ReflectionHelper.PropertyName<Models.BO.Customer>(x => ((Models.BO.Interfaces.ICustomerQueryOnly) x).Tasks),
"activeTasks", JoinType.LeftOuterJoin, Restrictions.IsNotNull("activeTasks.LockedBy")
)
.CreateAlias(ReflectionHelper.PropertyName<Models.BO.Customer>(x => ((Models.BO.Interfaces.ICustomerQueryOnly) x).Tasks2),
"availableTasks", JoinType.LeftOuterJoin,
availableTasksRestraction
)
.Add(Restrictions.Eq("CustomerBase", _customerBase))
.Add(Restrictions.Eq("IsActive", true));
在本例中,我需要提取所有客户以及每个客户的可用任务数和活动任务数 谢谢,我现在通过HQL实现了这一点,尽管它确实依赖于映射的所有连接关联-我希望创建一个查询来连接不相关的域对象,但我想映射关联是有意义的。是的,映射关联确实有意义。我认为如果不映射它们,就不可能完成您想做的事情。谢谢,我现在已经通过HQL实现了这一点,尽管它确实依赖于映射的所有联接关联-我希望创建一个查询来联接不相关的域对象,但我想映射关联是有意义的。是的,映射关联确实有意义。我认为如果不映射它们,就不可能做你想做的事情。我想做类似的事情,但找不到一种方法使左连接查询能够使用这种类型的连接。很遗憾,你不能根据定义进行外部θ连接,因为这两个元素都需要满足条件。因此,为了使用HQL,您需要按照Isurucanu的建议映射关联。我想这样做,但找不到一种方法使左连接查询能够使用这种类型的joinAh,很遗憾,您无法根据定义进行外部theta连接,因为这两个元素都需要满足条件。因此,为了使用HQL,您需要按照Isurucanu的建议映射关联。谢谢-最后选择了HQL解决方案,但很高兴了解withClause。谢谢-最后选择了HQL解决方案,但很高兴了解withClause。