MyselfInScope
概要
基本概念
自分自身のテーブルのサブクエリで絞り込みます。
ほとんどの場合において、この機能は意味を成しません。基本的には、サブクエリを利用しなくてもメインのクエリの方の where 句で同じ条件を指定すれば同じ結果を求めることができるからです。この機能の存在意義は、とある状況における回避的な策と言えます。
例えば、CLOB が含まれるテーブルで union を利用する場合で、CLOB の union を文法的に許さない DBMS の場合に、この MyselfInScope で union の絞り込み条件をサブクエリにすることで回避することができます。 (この場合、InScope で利用する関連カラムは PK カラム)
また、とある会員と同じ会員ステータスの会員を検索するというような場合、通常は会員ステータスのテーブルを経由して ExistsReferrer で実装しますが、マスタテーブルが省略されているようなDB設計においてはそれが利用できないため、この MyselfInScope を使って会員ステータスコード経由で同じ検索を実現します。(この場合、InScope で利用する関連カラムは会員ステータスコード)
会話上では、まいせるふいんすこーぷ と表現します。
実装方法
実装の流れ
query() の後、myselfInScope() を呼び出し、SubQuery のコールバック実装を引数に指定します。 SubQuery の中で SpecifyColumn を指定しなければデフォルトで PK カラム、SpecifyColumn が指定された場合は(指定は一つのみ)、その指定されたカラムが関連カラムとなります。
e.g. MyselfInScopeの実装手順 (Eclipseでコード補完) {MEMBER, BIRTHDATE} @Java
MemberCB cb = new MemberCB();
cb.q // .q と打って enter
--
cb.query()
--
// 1. .sc まで打つと比較条件選択
// 2. myI で enter
cb.query().myI
--
// メソッドが補完されて、引数の "subQuery" が選択状態に
cb.query().myselfInScope(subQuery)
--
// "new " (new + 空白一つ) と打って ctrl + space そして enter
cb.query().myselfInScope(new )
--
// 実装メソッドの空実装が自動生成される (Eclipse-3.5 以上)
cb.query().myselfInScope(new SubQuery<MemberCB>() {
public void query(MemberCB subCB) {
// TODO Auto-generated method stub
}
})
--
// ctrl (or command) + D で不要な空行やTODOコメントを消して
// 関連カラムと絞り込み条件を指定
cb.query().myselfInScope(new SubQuery<MemberCB>() {
public void query(MemberCB subCB) {
//subCB.specify().column...() // 指定がなければ PK カラム
subCB.query().setMemberStatusCode_Equal_Formalized(); // 絞り込み条件
}
});
e.g. MyselfInScopeを使って正式会員(のレコード)を取得 @DisplaySql
...
from MEMBER dfloc
where dfloc.MEMBER_ID = (select sub1loc.MEMBER_ID
from MEMBER sub1loc
where sub1loc.MEMBER_STATUS_CODE = 'FML'
)
...
メソッド仕様
基本仕様
- 引数の指定
- 引数の SubQuery は必須です。
- 関連カラムの指定はなし or 一つ
- SpecifyColumn での関連カラムの指定は、指定なし(PKカラム)か必ず一つだけです。 指定があり過ぎる場合は例外です。
- サブクエリのConditionBean
- サブクエリの ConditionBean は、関連カラムと絞り込み条件だけの指定に利用するものです。 SetupSelect や OrderBy などサブクエリとして必要のない機能は呼び出してはいけません。
サポートされるテーブル
基点テーブルが単一の主キーである必要があります。(複合主キーはNG)