InnerJoinAutoDetect

概要

状況依存 のスポット対応の機能です。普段は意識する必要はありません。

基本概念

手動で内部結合を指定する (Manual)InnerJoin とは別に、InnerJoin 可能な結合、つまり外部結合である必要のない外部結合を自動判別する機能があります(@since 0.9.8.8)。 ただし、その自動判別のロジックは完全に全ての InnerJoin 可能な結合を判別するわけではなく、比較的判別が簡易で安全なものだけを対象とします。 それゆえ、利用する場合は一度テスト実行でログを確認して要件を満たしているかどうかを確認する必要があります。 チューニングのためにピンポイントで内部結合を利用するのであれば、固定的な指定となる (Manual)InnerJoin の方がお奨めです。

判別ロジックは、そのリレーションを使って where 句での絞り込み条件が指定されているかどうかを基本としています。 ただし、IsNull の条件に関しては、外部結合を前提とする絞り込み条件となるため判別要素に含まれません。 また、FKカラムの NotNull 制約など依存型リレーションシップなのか非依存型リレーションシップなのかなどの要素は確実性を保証するのがとても難しいため考慮していません。 そして、判別ロジックはバージョンごとに変わる可能性があるので、厳密な仕様はドキュメント化しません。

諸刃の剣

TwoEdgedSword 認定のされた機能です。しっかり精度高く利用しないと、逆にカオスを生み出します。

一律の設定

この機能を利用せず一律の設定で自動判別したい場合は、littleAdjustmentMap.dfprop の isInnerJoinAutoDetect を true にすることで、全ての ConditionBean において反映されます。

実装方法

実装の流れ

絞り込み条件などを設定する前に、ConditionBean の allowInnerJoinAutoDetect() を呼び出します。

e.g. ConditionBeanに絞り込み条件が設定されているかどうか (Eclipseでコード補完) @Java
MemberCB cb = new MemberCB();
cb.allInJ // .allInJ と打って enter
--
cb.allowInnerJoinAutoDetect()
cb.setupSelect_MemberStatus();
cb.query.queryMemberStatus()...

メソッド仕様

メソッドを呼び出した後の Query 呼び出しのみ設定が有効になります。

Union や SubQuery では

Union や SubQuery などの ConditionBean にも設定は継承されます。

ネストしたリレーションでは

ネストしたリレーションが内部結合対象となった場合、そのリレーションを辿る途中のリレーションも内部結合となります。 (SQLの文法的にそのように判断しても問題ないため)