У меня есть вопрос об объединениях в 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 в объединение.
Как я могу сделать это быстро, не меняя определения моделей? Просто изменить только этот запрос без изменения всей модели?