Nhibernate加入过滤

时间:2011-07-01 13:00:52

标签: sql nhibernate inner-join where-clause

我有一个关于NHIBERNATE加入的问题。我们的sql查询生成但是nhibernate有问题。我们的db开发人员优化了原始sql,因此它可以根据需要工作,但是我们需要更改nhibernate代码以使生成的sql看起来像是优化的。

查询原始部分的部分是:

FROM   PERSON_VISIT this_
                     inner join PERSON_Basic per2_
                       on this_.PERSON_ID = per2_.PERSON_ID
                     left outer join PERSONC_QUESTIONS perint10_
                       on per2_.PERSON_ID = perint10_.PERSON_ID
                     left outer join TELEPHONE_QUESTIONS intaudit13_
                       on perint10_.PP_QUESTIONS_ID = intaudit13_.PP_QUESTIONS_ID
                     inner join C_QUESTIONS intdef14_
                       on perint10_.QUESTION_ID = intdef14_.QUESTION_ID
                          and perint10_.QUESTIONS_CODE = intdef14_.QUESTIONS_CODE
                          and perint10_.QUESTION_ID = intdef14_.QUESTION_ID

优化的是:

FROM   PERSON_VISIT this_
                     inner join PERSON_Basic per2_
                       on this_.PERSON_ID = per2_.PERSON_ID
                     left outer join PERSONC_QUESTIONS perint10_
                       on per2_.PERSON_ID = perint10_.PERSON_ID
                     left outer join TELEPHONE_QUESTIONS intaudit13_
                       on perint10_.PP_QUESTIONS_ID = intaudit13_.PP_QUESTIONS_ID
                     left outer join C_QUESTIONS intdef14_
                       on perint10_.QUESTION_ID = intdef14_.QUESTION_ID
                          and perint10_.QUESTIONS_CODE = intdef14_.QUESTIONS_CODE
                          and perint10_.QUESTION_ID = intdef14_.QUESTION_ID
                          and intdef14_.DISCIPLINE_CODE = this_.DISCIPLINE_CODE

要将查询从内部联接更改为左外部联接很容易,我只更改了一行代码:

        .CreateAlias("PersonInt.QuestionEntity", "IntDef", JoinType.LeftOuterJoin)

但我如何添加

                          and intdef14_.DISCIPLINE_CODE = this_.DISCIPLINE_CODE

使用nhibernate代码?

可以选择将PERSON_VISIT定义的引用添加到C_QUESTIONS,但问题是 PERSON_VISIT在任何地方都使用,我不希望这个更改可能会破坏其他查询,我只想添加一行代码来添加,我该怎么做?有没有办法访问原始连接来更改它?或者其他一些方法来添加这个

                          and intdef14_.DISCIPLINE_CODE = this_.DISCIPLINE_CODE

查询? 我知道有人会说我们可以通过criteria.Add添加对查询的限制,但它不是一个选项,因为db开发人员优化了我们的查询,将WHERE子句中的这个限制带到了连接。

如何在不更改模型定义的情况下快速完成此操作?只更改这一个查询而不更改整个模型?

2 个答案:

答案 0 :(得分:2)

可以使用HQL和Criteria API。

这个问题为您提供了答案:Adding conditionals to outer joins with nhibernate

这样的事情可以解决你的问题。

.CreateAlias("PersonInt.QuestionEntity", "IntDef", JoinType.LeftOuterJoin, 
      Restrictions.EqProperty("DISCIPLINE_CODE", "IntDef.DISCIPLINE_CODE"))

答案 1 :(得分:0)

感谢您的回答。我们在项目中使用2.0版本的NHibernate,因此我们没有机会使用.CreateAlias的新方法有限制。

我已使用拦截器解决了一个问题:

public class SqlInterceptor : EmptyInterceptor, IInterceptor
{
    SqlString IInterceptor.OnPrepareStatement(SqlString sql)
    {
        //manipulating with the sql

        return sql;
    }
}

大于

        var factory = Session.SessionFactory;
        var session = factory.OpenSession(new SqlInterceptor());

使用我的查询而不做任何更改。