データベースの参照制御(select)
SQLのSELECT句を組立て実行します。取得したデータは処理中に参照が可能な他、
mappingタグを用いてDataBeanに値を返却できます。
selectタグはサブタグを組合わせることで、等結合や外部結合、副問い合わせなど
様々なSQL文を発行することができます。
- 使用可能箇所
- run
- Sub Tags
- link,
join,
where,
group,
order,
value,
formula
属性
- id
- 返却値を管理するID
- type
-
- fill
- 単一検索 ※複数件取得できた場合は先頭の1件のみ返却 (Map型を返却)
- find
- 複数件検索 (List型を返却)
- csv
- CSV出力についてはこちらを参照
- 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>
参照テーブルの直積(link)と外部結合(join)
SELECTタグを用いてデータベースを参照する際に参照するテーブルを等結合または外部結合します。
- 使用可能箇所
- select
- Sub Tags
- 記述不可
属性
- entity
- テーブル名/ビュー名
- schema
- 標準のスキーマ
- column
- データ取得カラム
- keys
-
結合条件となるカラム名(カンマ区切りにて複数指定可)
結合条件のカラム名が異なる場合は、比較演算子(eq/ne etc..)を用いて条件を記述します
※結合条件内には{@コマンド・テキスト}が使用できます。
[keys内で使用できる予約語]
@prm:パラメータコンテナのキー名
@val:固定値
@formula:数式
@NULL
- type
-
外部結合(join)オプション
- left
- LEFT OUTER JOIN
- full
- FULL OUTER JOIN
- base
- 結合先のテーブル名
- when
-
多くのTagsでサポートしている「実行可否判定のための属性」です。
(こちらを参照)
(記述例)
「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>
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>