【问题标题】:NHibernate Collection Left Outer Join Where Clause IssueNHibernate Collection Left Outer Join Where 子句问题
【发布时间】:2010-09-29 18:23:53
【问题描述】:

似乎在使用以下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 的解决方案。

【问题讨论】:

  • 你可以看看 nhibernate 日志文件,看看发出了什么 sql 语句。

标签: asp.net sql nhibernate


【解决方案1】:

试试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>();

【讨论】:

    【解决方案2】:

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

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

    您想要的不是 where 子句,而是连接的附加条件。希望对您有所帮助。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-30
    • 2010-11-26
    • 1970-01-01
    • 2016-11-06
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    相关资源
    最近更新 更多