はじめに
今回は、
外だしSQLとは?
まずは
外だしSQLは、
SQLは
-- 会員IDと名称の前方一致で絞り込んで、会員一覧と購入最大価格を検索。
-- 絞り込み条件はそれぞれ値がnullじゃければ評価する。
select member.MEMBER_ID
, member.MEMBER_NAME
, (select max(purchase.PURCHASE_PRICE)
from PURCHASE purchase
where purchase.MEMBER_ID = member.MEMBER_ID) as MAX_PURCHASE_PRICE
from MEMBER member
/*BEGIN*/where
/*IF pmb.memberId != null*/member.MEMBER_ID = /*pmb.memberId*/3/*END*/
/*IF pmb.memberName != null*/and member.MEMBER_NAME like /*pmb.memberName*/'ス' || '%'/*END*/
/*END*/
SQLは、
開発者は、
現場ではよく
DBFluteでは、
また、
S2Daoでは本来
実行の仕方
では、
SQLは、
- src/
main/ resources/ sql/ member/ selectMemberWithMaxPurchasePrice. sql
以下のサンプルをご覧下さい。
/**
* 会員一覧と最大購入価格をリスト検索。
* 会員名称が「ス」で始まる会員を対象に検索する。
*
* @throws Exception
*/
public void test_OutsideSql_selectList_BasicExecution_Tx() throws Exception {
// ## Arrange ##
final String path = "sql/member/selectMemberWithMaxPurchasePrice.sql";
final MemberWithMaxPurchasePricePmb pmb = new MemberWithMaxPurchasePricePmb();
pmb.setMemberName("ス");
final Class entityType = MemberWithMaxPurchasePrice.class;
// ## Act ##
final List memberList
= memberBhv.outsideSql().selectList(path, pmb, entityType);
// ## Assert ##
for (MemberWithMaxPurchasePrice member : memberList) {
final String memberName = member.getMemberName();
final Integer maxPurchasePrice = member.getMaxPurchasePrice();
log.debug(memberName + " - " + maxPurchasePrice);
assertTrue(memberName.startsWith("ス"));
}
}
public static class MemberWithMaxPurchasePrice {
protected Integer memberId;
protected String memberName;
public Integer getMemberId() {
return memberId;
}
public void setMemberId(Integer memberId) {
this.memberId = memberId;
}
public String getMemberName() {
return memberName;
}
public void setMemberName(String memberName) {
this.memberName = memberName;
}
}
public static class MemberWithMaxPurchasePrice {
protected Integer memberId;
protected String memberName;
protected Integer maxPurchasePrice;
public Integer getMemberId() {
return memberId;
}
public void setMemberId(Integer memberId) {
this.memberId = memberId;
}
public String getMemberName() {
return memberName;
}
public void setMemberName(String memberName) {
this.memberName = memberName;
}
public Integer getMaxPurchasePrice() {
return maxPurchasePrice;
}
public void setMaxPurchasePrice(Integer maxPurchasePrice) {
this.maxPurchasePrice = maxPurchasePrice;
}
}
BehaviorのoutsideSql()メソッドに続いてselectList()というメソッドを呼び出しています。ここで、
引数は、
上記の例では実は会員Entityをそのまま引数として利用することも可能です。つまり、
しかし、
戻り値の型は、
しかし、
上記の例においても、
Sql2Entityによる外だし支援
「実行の仕方」
その通りです。S2Daoで外だしSQLを実装する際の弱点はまさしくここでした。
DBFluteはこういったところを見逃しません。おおいに支援します。
Sql2Entityと呼ばれる支援機能により、
CustomizeEntityの自動生成
SQLの行コメントとして、
「--」
-- #MemberWithMaxPurchasePrice#
-- 会員IDと名称の前方一致で絞り込んで、会員一覧と購入最大価格を検索。
-- 絞り込み条件はそれぞれ値がnullじゃければ評価する。
select member.MEMBER_ID
, member.MEMBER_NAME
...(以下変わらず)
この一行を足して、
すると、
このSql2Entityでの生成を利用することにより、
実はSql2Entityは、
実行することにより、
これは、
また、
このSql2Entityで自動生成されたEntityをDBFluteでは
ParameterBeanの自動生成
さらに、
SQLの行コメントとして、
また、
-- #MemberWithMaxPurchasePrice#
-- !MemberWithMaxPurchasePricePmb!
-- !!Integer memberId!!
-- !!String memberName!!
-- 会員IDと名称の前方一致で絞り込んで、会員一覧と購入最大価格を検索。
-- 絞り込み条件はそれぞれ値がnullじゃければ評価する。
select member.MEMBER_ID
, member.MEMBER_NAME
...(以下変わらず)
で、
すると、
また、
実は、
実際の業務では、
そのため、
しかし、
このSql2Entityで自動生成された引数のBeanをDBFluteでは
まとめ
複雑なSQLを実装するのに大活躍する外だしSQLの基本利用をご理解頂けましたでしょうか?
DBFluteはConditionBeanだけが
そのSQLの実装はとても大事です。DBFluteはSql2Entityでより安全なOutsideSql
その他、
次回はそれら機能を紹介します。