EmbedCondition
概要
アーキテクト向けの機能です。
基本概念
指定されたカラムの絞り込み条件をバインド変数を使わない条件にします。
万が一でも、使いたくない機能です。ですが、ごくごく稀に、バインド変数を使わないで条件値をSQLに埋め込むとパフォーマンスが向上する、というような状況があります。 オプティマイザの理論としては、そういうことがあって当然ではあるのですが、業務上それに関わった問題に直面することは多くはないでしょう。 その万が一のために、そういうときのために、ConditionBeanの絞り込み条件において、カラム指定でバインド変数を使わずに条件値をSQLに埋め込むことができます。 その条件値が、アプリのユーザ入力値で文字列型の場合は、SQLインジェクションに要注意です。
ディベロッパー向けに思えますが、アーキテクトへの相談無しに利用してはいけません。そういう意味で、"アーキテクト向けの機能" と謳っています。
諸刃の剣
TwoEdgedSword 認定のされた機能です。自分を斬りつけて最も痛い思いをする可能性のある機能です。 埋め込む条件値が、アプリのユーザ入力値で文字列型の場合は、必ず別の方法でのSQLインジェクション対策を行って下さい。
実装方法
実装の流れ
embedCondition() を呼び出し、第一引数に埋め込み対象のカラム、第二引数に条件値をクォートするかどうかを指定します。
e.g. EmbedConditionの実装 @Java
MemberCB cb = new MemberCB();
... // もろもろの条件などを設定
Set<ColumnInfo> plainSet = new HashSet<ColumnInfo>();
plainSet.add(MemberDbm.getInstance().columnMemberId()); // 数値型
cb.embedCondition(plainSet, false) // クォートしない場合
Set<ColumnInfo> quotedSet = new HashSet<ColumnInfo>();
quotedSet.add(MemberDbm.getInstance().columnMemberName()); // 文字列型
quotedSet.add(MemberDbm.getInstance().columnBirthdate()); // 日付型
cb.embedCondition(quotedSet, true) // クォートする場合
... = memberBhv.selectList(cb); // 指定されたカラムの条件値は埋め込まれる
メソッド仕様
基本仕様
- 引数の指定
- 引数の embeddedColumnInfoSet は必須(nullであってはいけない)です。 また、null 要素も許されません。
- null 要素
- null 要素は許されません
- ColumnInfo は DBMeta のもの
- ColumnInfoのインスタンスは DBMeta から取得したものである必要があります。
空セットは全条件埋め込み
空セットを指定した場合は、全条件が埋め込みとなります。
カラム名だけで判定
カラム名だけで判定します。よって、別テーブル同名カラムの条件がそれぞれある場合、両方に適用されます。
呼び出しタイミング
実行時に評価されるので、いつ設定しても構いません。(習慣的に、条件設定後で、実行する直前)
非推奨メソッド
deprecated になっています。将来的に削除されるわけではありませんが、"安易に使ってくれるな" ということを示します。