DBアクセスを定番化しよう DBFlute入門
第4回 ConditionBeanにおける結合やソート
はじめに
前回は,ConditionBeanの条件組立ての基本機能をみていきました。
今回は,結合やソートの基本をみていきましょう。
ConditionBean
ConditionBeanにおける結合とは?
まず,ConditionBeanにおける結合とは何を示すかを意識合わせしておきましょう。結合のそのものの意味では単に「テーブルを結合する」ことだけを示します。結合すること自体は「手段」であり「目的」ではありません。
では,目的はどんなものがあるかというと,主に次の2つに整理できます。
- 結合先テーブルのデータを取得すること
- 結合先テーブルの条件で結果を絞り込むこと
ConditionBeanにおける結合は,このような目的を意識した仕様となっています。具体的には,プログラマはConditionBeanに対して上記の目的をそのまま伝えます。そして,結合をするかしないかは,指定された目的を基に自動で判別します。
例えば,「結合先テーブルの条件で結果を絞り込むこと」という目的を達したい場合は,以下(リスト1,2)のようになります。
リスト1:結合先テーブルのデータを取得する-ConditionBeanでの指定
final MemberCB cb = new MemberCB();
// 親テーブルの会員ステータスを結合し,Select句に含める。
cb.setupSelect_MemberStatus();
リスト2:結合先テーブルのデータを取得する-実行されるSQL文
select member.MEMBER_ID, ... , memberStatus.MEMBER_STATUS_CODE, ...
from MEMBER member
left outer join MEMBER_STATUS memberStatus
on member.MEMBER_STATUS_CODE = memberStatus.MEMBER_STATUS_CODE
また,「結合先テーブルの条件で結果を絞り込むこと」という目的を達したい場合は,以下(リスト3,4)のようになります。
リスト3:結合先テーブルの条件で結果を絞り込む-ConditionBeanでの指定
final MemberCB cb = new MemberCB();
// 親テーブルの会員ステータスを結合し,
// 「'正'という文字で始まる会員ステータス名」という条件で絞り込む。
cb.query().queryMemberStatus().setMemberStatusName_PrefixSearch("正");
リスト4:結合先テーブルの条件で結果を絞り込む-実行されるSQL文
select member.MEMBER_ID, ...
from MEMBER member
left outer join MEMBER_STATUS memberStatus
on member.MEMBER_STATUS_CODE = memberStatus.MEMBER_STATUS_CODE
where memberStatus.MEMBER_STATUS_NAME like '正%'
無論,これら目的が同居する場合は,以下(リスト5,6)のようになります。
結合に関連する目的が2つ指定されたからといって,SQL上でJoin節が2つ出力されてしまうことはありません。
リスト5:結合先テーブルの条件で結果を絞り込む-ConditionBeanでの指定
final MemberCB cb = new MemberCB();
// 親テーブルの会員ステータスを結合し,Select句に含める。
cb.setupSelect_MemberStatus();
// 親テーブルの会員ステータスを結合し,
// 「'正'という文字で始まる会員ステータス名」という条件で絞り込む。
cb.query().queryMemberStatus().setMemberStatusName_PrefixSearch("正");
リスト6:結合先テーブルの条件で結果を絞り込む-実行されるSQL文
select member.MEMBER_ID, ..., memberStatus.MEMBER_STATUS_CODE, ...
from MEMBER member
left outer join MEMBER_STATUS memberStatus
on member.MEMBER_STATUS_CODE = memberStatus.MEMBER_STATUS_CODE
where memberStatus.MEMBER_STATUS_NAME like '正%'
ConditionBeanでは,結合先テーブルの条件を追加したからといって,勝手に結合先テーブルのデータを取得することはしません。
実際の業務ロジックでは,「結合先テーブルの条件で絞り込んでデータとして取得するのは基点テーブルのみ」ということも多々あります。不要な結合先のテーブルのデータは取得しないようにするべき,というのがConditionBeanの思想です。
「呼び出し側プログラムが必ず何のテーブルを取得したいのか? (絞込み条件に関わらず)を意識するべき」という考えのもと設計されています。
DBアクセスを定番化しよう DBFlute入門
- 第8回 応用編「ページング検索」
- 第7回 応用編「エスケープ付き曖昧検索」
- 第6回 外だしSQLの様々な機能
- 第5回 外だしSQLの基本
- 第4回 ConditionBeanにおける結合やソート
- 第3回 ConditionBeanで色々な条件組み立て
- 第2回 DBFluteではじめてのDBアクセス
- 第1回 DBFluteの概要


