DBアクセスを定番化しよう DBFlute入門

第4回 ConditionBeanにおける結合やソート

この記事を読むのに必要な時間:およそ 7.5 分

はじめに

前回は,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の思想です。

「呼び出し側プログラムが必ず何のテーブルを取得したいのか? (絞込み条件に関わらず)を意識するべき」という考えのもと設計されています。

著者プロフィール

久保雅彦(くぼまさひこ)

DBFluteメインコミッタ。主にオープン系の開発に従事。DB設計・DB周りの実装などを担当することが多い。

コメント

コメントの記入