NHibernate Collection Left Outer Join Where Clause Issue

时间:2010-09-29 18:23:53

标签: asp.net sql nhibernate

似乎在使用以下NHibernate查询时,当左外连接没有记录时,我没有得到根实体。

ICriteria critera = session.CreateCriteria(typeof(Entity));

criteria.CreateCriteria("SubTable.Property", "Property", NHibernate.SqlCommand.JoinType.LeftOuterJoin);

criteria.Add(Expression.Not(Expression.Eq("Property", value)));

我想要生成的SQL是:

SELECT * FROM BaseTable
LEFT JOIN (
    SELECT * FROM SubTable
    WHERE Property <> value
)Sub ON Sub.ForeignKey = BaseTable.PrimaryKey

请注意,where子句位于左连接的select语句中。这样,如果没有任何加工子记录,我们仍然会得到一个顶级记录。似乎NHibernate正在生成以下SQL。

SELECT * FROM BaseTable
LEFT JOIN (
    SELECT * FROM SubTable
)Sub ON Sub.ForeignKey = BaseTable.PrimaryKey
WHERE Sub.Property <> value

无论如何要实现第一块SQL吗?我已经尝试过了:

ICriteria critera = session.CreateCriteria(typeof(Entity));

criteria.CreateCriteria("SubTable.Property", "Property", NHibernate.SqlCommand.JoinType.LeftOuterJoin);

criteria.Add(
    Restrictions.Disjunction()
        .Add(Expression.IsNull("Property"))
        .Add(Expression.Not(Expression.Eq("Property", value)));

我正在寻找使用Criteria API的解决方案。

2 个答案:

答案 0 :(得分:0)

我不使用nHibernate,但我认为这是您需要生成的SQL:

SELECT * 
FROM BaseTable 
LEFT JOIN SubTable sub
 ON Sub.ForeignKey = BaseTable.PrimaryKey and  sub.Property <> value 

你想要的是什么,不是一个地方,而是一个附加条件。希望有所帮助。

答案 1 :(得分:0)

尝试this

var hql = @"select bt
            from BaseTable bt
                left join bt.SubTable subt
                    with subt.Property <> :property";

或者也许:

var hql = @"select bt
            from BaseTable bt
                left join bt.SubTable subt
                    where subt.ForeignKey = bt.PrimaryKey
                        and subt.Property <> :property";

最后:

var result = session.CreateQuery(hql)
                    .SetParameter("property", "whateverValue")
                    .List<BaseTable>();