【发布时间】:2011-09-26 18:09:45
【问题描述】:
我有一个关于加入 NHIBERNATE 的问题。我们的 sql 查询存在问题,该查询已生成但处于休眠状态。我们的 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
使用休眠代码?
有一个选项可以将 PERSON_VISIT 定义中的引用添加到 C_QUESTIONS,但问题是 PERSON_VISIT 无处不在,我不希望这个更改可能破坏其他查询,我只想添加一行代码来添加,我该怎么做?有什么办法可以访问原始联接来更改它?或者其他方式来添加这个
and intdef14_.DISCIPLINE_CODE = this_.DISCIPLINE_CODE
要查询吗? 我知道有人会说我们可以通过条件为查询添加限制。添加,但这不是一个选项,因为 db 开发人员优化了我们的查询,将这个限制从 WHERE 子句带到了连接。
如何在不更改模型定义的情况下快速做到这一点?只更改这一个查询而不更改整个模型?
【问题讨论】:
标签: sql nhibernate inner-join where-clause