Nhibernate объединяет фильтрацию - PullRequest
0 голосов
/ 01 июля 2011

У меня есть вопрос об объединениях в NHIBERNATE. У нас была проблема с нашим SQL-запросом, который был сгенерирован, но nhibernate. Наш разработчик БД оптимизировал сырой 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

К запросу? Я знаю, что кто-то скажет, что мы можем добавить ограничение к запросу с помощью критериев. Добавьте, но это не вариант, поскольку db developer оптимизировал наш запрос, перенеся это ограничение из предложения WHERE в объединение.

Как я могу сделать это быстро, не меняя определения моделей? Просто изменить только этот запрос без изменения всей модели?

Ответы [ 2 ]

2 голосов
/ 01 июля 2011

Это возможно при использовании HQL и Criteria API.

Этот вопрос дает вам ответ: Добавление условных обозначений во внешние объединения с помощью nhibernate

Нечто подобное может решить вашу проблему.

.CreateAlias("PersonInt.QuestionEntity", "IntDef", JoinType.LeftOuterJoin, 
      Restrictions.EqProperty("DISCIPLINE_CODE", "IntDef.DISCIPLINE_CODE"))
0 голосов
/ 04 июля 2011

Спасибо за ответы. Мы используем версию 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());

И используйте мой запрос без изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...