データベースの参照制御(select)

SQLのSELECT句を組立て実行します。取得したデータは処理中に参照が可能な他、
mappingタグを用いてDataBeanに値を返却できます。
 
selectタグはサブタグを組合わせることで、等結合や外部結合、副問い合わせなど
様々なSQL文を発行することができます。
使用可能箇所
run
Sub Tags
link, join, where, group, order, value, formula

属性
id
返却値を管理するID
type
entity
テーブル名/ビュー名、またはビュー・クラス名
transaction
トランザクション設定ファイルのXMLファイル名(例:default)
database
トランザクション設定ファイル内の接続設定のコード
schema
標準スキーマ
when
多くのTagsでサポートしている「実行可否判定のための属性」です。 (こちらを参照)

(記述例) 「SYS_USER」のUSER_CODEが、DataBeanのIDの値と一致するデータを1件検索(fill)

    <run>
     <select id="USER_LIST" entity="SYS_USER" type="fill">
      <where>
       <data key="ID" map="USER_CODE" type="eq" def="NULL" />
      </where>
     </select>
    </run>
  
(注) def属性を設定しないとDataBeanのIDがNULLの場合、条件なしの検索となる(詳細はwhereのdataタグを参照) (記述例) 「SYS_USER」のUSER_NAMEが、DataBeanのNAMEの値が含まれるデータを検索(find)

    <run>
     <select id="USER_LIST" entity="SYS_USER" type="find">
      <where>
       <data key="NAME" map="USER_NAME" type="like" />
      </where>
     </select>
    </run>
  
SELECTタグを用いてデータベースを参照する際に参照するテーブルを等結合または外部結合します。
属性
(記述例) 「SYS_USER」「SYS_USER_GROUP」「SYS_ GROUP」を等結合し、
「SYS_USER_AUTHORITY」のAUTH_CODEが'ADMIN'のものを取得
 
SQL文 SELECT SYS_USER.*, SYS_USER_GROUP.GROUP_CODE, SYS_GROUP.GROUP_NAME
   FROM SYS_USER
   INNER JOIN SYS_USER_GROUP
    ON SYS_USER_GROUP.CORPORATE_CODE = SYS_USER.CORPORATE_CODE
    AND SYS_USER_GROUP.USER_CODE = SYS_USER.USER_CODE
   INNER JOIN SYS_GROUP
    ON SYS_GROUP.CORPORATE_CODE = SYS_USER_GROUP.CORPORATE_CODE
    AND SYS_GROUP.GROUP_CODE = SYS_USER.GROUP_CODE
   LEFT OUTER JOIN SYS_USER_AUTHORITY
    ON SYS_USER_AUTHORITY.CORPORATE_CODE = SYS_USER.CORPORATE_CODE
    AND SYS_USER_AUTHORITY.USER_CODE = SYS_USER.USER_CODE
    AND SYS_USER_AUTHORITY.AUTH_CODE = 'ADMIN'

    <select id="USER_LIST" entity="SYS_USER" type="find">
     <link entity="SYS_USER_GROUP" keys="CORPORATE_CODE, USER_CODE"
      column="GROUP_CODE" base="SYS_USER" />
     <link entity="SYS_GROUP" keys="CORPORATE_CODE, GROUP_CODE"
      column="GROUP_NAME" base="SYS_USER_GROUP" />
     <join entity="SYS_USER_AUTHORITY" keys="CORPORATE_CODE, USER_CODE, AUTH_CODE eq '@val:ADMIN'"
      base="SYS_USER" />
     <where>
      <data key="ID" map="USER_CODE" type="eq" />
     </where>
    </select>
  

参照条件(where)

SELECTタグを用いてデータベースを参照する際に検索条件が定義できます。
使用可能箇所
select
Sub Tags
condition, data

(記述例) 「SYS_USER」のUSER_CODEが、DataBeanのIDの値と一致するデータを検索

    <select id="USER_LIST" entity="SYS_USER" type="fill">
     <where>
      <data key="ID" map="USER_CODE" type="eq" />
     </where>
    </select>
  

AND条件の定義

dataタグを複数記述することでAND条件が定義できます(dataタグはこちらを参照)。 (記述例) 「SYS_USER」のUSER_CODEがDataBeanのIDの値と一致しFLAGが0のデータを検索

    <select id="USER_LIST" entity="SYS_USER" type="fill">
     <where>
      <data key="ID" map="USER_CODE" type="eq" />
      <data val="0" map="FLAG" type="eq"
       datatype="java.lang.Integer" dataformat="#" />
     </where>
    </select>
  

OR条件の定義

whereタグを複数記述することでOR条件が定義できます (dataタグはこちらを参照)(記述例) 「SYS_USER」のUSER_CODEがDataBeanのIDの値と一致しFLAGが0またはFLAGが9のデータを検索

    <select id="USER_LIST" entity="SYS_USER" type="fill">
     <where>
      <data key="ID" map="USER_CODE" type="eq" />
      <data val="0" map="FLAG" type="eq"
       datatype="java.lang.Integer" dataformat="#" />
     </where>
     <where>
      <data val="9" map="FLAG" type="eq"
       datatype="java.lang.Integer" dataformat="#" />
     </where>
    </select>
  

条件タグ(data)

whereタグと併せて使用する絞込み条件を定義するタグ。
(注)比較値(key/val)がNULLの場合、dataタグは有効となりません。
💡比較値がNULLの場合も比較条件に含める場合はdef属性にNULLを定義してください。 属性
key
比較値(DataBeanの項目名)
val
比較値(固定値) ※固定値にはコマンド・テキストが使用できます。
def
初期値(比較値がNULLの場合に使用する値)
datatype
データ型
dataformat
データ様式
※固定値を使用する場合、カラムのデータ型にあわせてdatatypeおよびdataformatを
 定義してください。
map
比較対象(カラム名)
formula
数式 ※数式内にはコマンド・テキストが使用できます。
type
比較条件
base
参照先のテーブル名 ※複数のテーブルを結合している際は定義されることを推奨
when
多くのタグでサポートしている「実行可否判定のための属性」です。(こちらを参照)

比較演算子
比較演算子 効果 比較演算子 効果
eq 比較対象と比較値は等しい ne 比較対象と比較値は異なる
ge 比較対象は比較値以下 le 比較値は比較対象以下
gt 比較対象は比較値未満 lt 比較値は比較対象未満
like 比較対象に比較値が含まれる not_like 比較対象に比較値が含まれない
like% 比較対象の先頭が比較値で始まる not_like% 比較対象の先頭が比較値で始まらない
%like 比較対象の後尾が比較値で終わる %not_like 比較対象の後尾が比較値で終わらない
複数形
比較演算子 効果 比較演算子 効果
a_eq 比較対象と比較値の何れかは等しい a_ne 比較対象と比較値の何れもと異なる
a_like 比較対象に比較値の何れかが含まれる a_not_like 比較対象に比較値の何れもが含まれない
a_like% 比較対象の先頭が比較値の何れかで始まる a_not_like% 比較対象の先頭が比較値の何れも始まらない
%a_like 比較対象の後尾が比較値の何れかで終わる %a_not_like 比較対象の後尾が比較値の何れも終わらない
数式のみ
比較演算子 任意の数式 ※比較対象および比較値の指定不要
(記述例) 「SYS_USER」のUSER_CODEがDataBeanのIDの値を含まれるデータを検索
バグ等によりID がNULLとなった場合はNULLで検索(異なるデータが取得されないよう考慮)

    <select id="USER_LIST" entity="SYS_USER" type="fill">
     <where>
      <data key="ID" map="USER_CODE" type="eq" def="NULL" />
     </where>
    </select>
  

複数のカラムにOR条件で比較する
map属性に複数のカラム名を|で区切り定義することで、比較値が何れかのカラムに含まれているデータが検索できます。 (記述例) 「SYS_USER」のUSER_NAMEまたはUSER_KANAがDataBeanのNAMEの値を含まれるデータを検索

    <select id="USER_LIST" entity="SYS_USER" type="fill">
     <where>
      <data key="NAME" map="USER_NAME|USER_KANA" type="like" />
     </where>
    </select>
  

集約条件(group)

SELECTタグを用いてデータベースを参照する際に集約条件が定義できます。
使用可能箇所
select
Sub Tags
condition, data

(記述例) 「SYS_USER」に「SYS_USER_LICENSE」をCORPORATE_CODEとUSER_CODEを条件に外部結合し
USER_CODEとLICENSEの数を取得(USER_CODEで集約)

    <select id="USER_LIST" entity="SYS_USER" type="find">
     <value map="USER_CODE" />
     <value formula="COUNT({SYS_USER_LICENSE}.{LICENSE})" key="LICENSE_COUNT" />
     <join entity="SYS_USER_LICENSE" keys="CORPORATE_CODE, USER_CODE" base="SYS_USER" />
      <group>
       <data map="USER_CODE" base="SYS_USER" />
      </group>
    </select>
  

条件タグ(data)

groupタグと併せて使用する集約対象のカラムを定義するタグ。 属性
map
集約対象(カラム名) ※「*」を使用することでDISTINCTを付与します
base
参照先のテーブル名 ※複数のテーブルを結合している際は定義されることを推奨
when
多くのタグでサポートしている「実行可否判定のための属性」です。(こちらを参照)

(記述例) 「SYS_USER」に「SYS_USER_LICENSE」をCORPORATE_CODEとUSER_CODEを条件に外部結合し
USER_CODEとLICENSEの数を取得(CORPORATE_CODEおよびUSER_CODEで集約)

    <select id="USER_LIST" entity="SYS_USER" type="find">
     <value map="CORPORATE_CODE" />
     <value map="USER_CODE" />
     <value formula="COUNT({SYS_USER_LICENSE}.{LICENSE})" key="LICENSE_COUNT" />
     <join entity="SYS_USER_LICENSE" keys="CORPORATE_CODE, USER_CODE" base="SYS_USER" />
      <group>
       <data map="CORPORATE_CODE" base="SYS_USER" />
       <data map="USER_CODE" base="SYS_USER" />
      </group>
    </select>
  
(記述例) 「SYS_USER」に「SYS_USER_ACTIVITY」をCORPORATE_CODEとUSER_CODEを条件に外部結合し
ACTIVITY_TYPEがERRORのレコードを保有するUSER_CODEをDISTINCTにて取得(重複するUSER_CODEを集約)

    <select id="USER_LIST" entity="SYS_USER" type="find">
     <value map="USER_CODE" />
     <join entity="SYS_USER_ACTIVITY" keys="CORPORATE_CODE, USER_CODE, ACTIVITY_TYPE eq '@val:ERROR'"
      base="SYS_USER" />
      <group>
       <data map="*" />
      </group>
    </select>
  

並び順(order)

SELECTタグを用いてデータベースを参照する際に並び順が定義できます。
使用可能箇所
select
Sub Tags
condition, data

(記述例) 「SYS_USER」をUSER_CODEの昇順で取得

    <select id="USER_LIST" entity="SYS_USER" type="find">
     <order>
      <data map="USER_CODE" sort="asc" base="SYS_USER" />
     <order />
    </select>
  

条件タグ(data)

orderタグと併せて使用する集約対象のカラムを定義するタグ。 属性
map
ソートするカラム(カラム名)
sort
昇順(asc) / 降順(desc)
base
参照先のテーブル名 ※複数のテーブルを結合している際は定義されることを推奨
cache
ソート条件を別途画面から指定したいときに使用
when
多くのタグでサポートしている「実行可否判定のための属性」です。(こちらを参照)

(記述例) 「SYS_USER」をCORPORATE_CODEの降順、USER_CODEの昇順で取得
CORPORATE_CODEとUSER_CODE、LICENSEの数を取得(CORPORATE_CODEおよびUSER_CODEで集約)

    <select id="USER_LIST" entity="SYS_USER" type="find">
     <value map="CORPORATE_CODE" />
     <value map="USER_CODE" />
     <value formula="COUNT({SYS_USER_LICENSE}.{LICENSE})" key="LICENSE_COUNT" />
     <join entity="SYS_USER_LICENSE" keys="CORPORATE_CODE, USER_CODE" base="SYS_USER" />
     <group>
      <data map="CORPORATE_CODE" sort="desc" base="SYS_USER" />
      <data map="USER_CODE" sort="asc" base="SYS_USER" />
     </group>
    </select>
  

データの絞込みとカスタマイズ(value)

SELECTタグを用いてデータベースを参照する際に取得するカラムを絞込む他、
数式の記述や別名などが定義できます。
使用可能箇所
select
Sub Tags
記述不可

属性
map
参照テーブルのカラム名
def
初期値 ※取得した値がNULLの場合に返却する値
val
固定値 ※固定値にはコマンド・テキストが使用できます。
key
別名
formula
数式 ※数式内ではコマンド・テキストが使用できます。
when
多くのタグでサポートしている「実行可否判定のための属性」です。(こちらを参照)

(記述例) 「SYS_USER」のUSER_CODEをIDの別名で取得

   <select id="USER_LIST" entity="SYS_USER" type="fill">
    <value map="USER_CODE" key="ID" />
   </select>
  
(記述例) 「SYS_USER」のAGEの最大値をMAX_AGEの名前で取得

   <select id="USER_LIST" entity="SYS_USER" type="fill">
    <value formula="MAX({AGE})" key="MAX_AGE" />
   </select>
  

数式の結果を取得(formula)

SELECTタグを用いてデータベースを参照する際に使用する数式が定義できます。
※valueタグのformula属性では書きづらい長文の数式を用いる場合に使用。
※formula属性と同様に数式内ではコマンド・テキストが使用できます。
使用可能箇所
select
Sub Tags
記述不可

属性
key
別名
when
多くのタグでサポートしている「実行可否判定のための属性」です。(こちらを参照)

(記述例) 「SYS_USER」のAGEの最大値をMAX_AGEの名前で取得しDataBeanのRATEの値を掛ける

    <select id="USER_LIST" entity="SYS_USER" type="fill">
     <formula key="MAX_AGE">
     <![CDATA[
      MAX({AGE}) * {@resource:RATE}
     ]]>
     </formula>
    </select>
  

©Camel engineering LLP