- PR -

iBatis:dynamic タグ内に静的な条件は書けない?

1
投稿者投稿内容
ジョン
会議室デビュー日: 2005/11/17
投稿数: 1
投稿日時: 2005-11-17 21:30
はじめまして。
O/R マッピングツールとして iBatis を使っているのですが、SQL で使用する dynamic タグについて教えてください。
下記のように、dynamic タグで WHERE 句を生成した場合も、3 つ目の「COL_3 = ?」は必ず有効になるようにしたいのですが、指定方法が分からず困っています。

<dynamic prepend="where">
<isNotEmpty prepend="and" property="prop1">COL_1 = #prop1#</isNotEmpty>
<isNotEmpty prepend="and" property="prop2">COL_2 = #prop2#</isNotEmpty>
<is... prepend="and" property="prop3">COL_3 = #prop3#</is...>
</dynamic>

以下は自分なりに考えた代替案ですが、どれもイマイチなのです。
■案1
<isParameterPresent> タグを使用する。
<isParameterPresent prepend="and">COL_3 = #prop3#</isParameterPresent>

-> Dao にて queryForList("sqlId", null) と指定された場合に結局は無効となってしまう。

■案2
条件句の書き方を以下のようにする。
WHERE COL_3 = #prop3#
<dynamic>
<isNotEmpty prepend="and" property="prop1" removeFirstPrepend="false">COL_1 = #prop1#</isNotEmpty>
<isNotEmpty prepend="and" property="prop2" removeFirstPrepend="false">COL_2 = #prop2#</isNotEmpty>
</dynamic>

-> 全ての条件に removeFirstPrepend="false" の指定が必要になる。
-> 静的な条件は必ず WHERE 句の先頭に書かなくてはならないという制約が増える。
-> is~ タグをネストした場合、子供の is~ タグの中で静的な条件を指定することができない。

■案3
下記のようにタグを自作できないか?
<static prepend="and">COL_3 = #prop3#</static>

-> SqlTagHandlerFactory クラスの実装を見る限り、タグの拡張はムリっぽい。。

もし良い解決策がありましたら、ぜひご教授お願い致します。

[ メッセージ編集済み 編集者: ジョン 編集日時 2005-11-18 00:26 ]
tsuboyang
会議室デビュー日: 2002/09/30
投稿数: 6
投稿日時: 2005-11-30 14:05
where COL_3 = #prop3#
<dynamic prepend="and">
<isNotEmpty prepend="and" property="prop1">COL_1 = #prop1#</isNotEmpty>
<isNotEmpty prepend="and" property="prop2">COL_2 = #prop2#</isNotEmpty>
</dynamic>

で、いけると思いますよ。
1

スキルアップ/キャリアアップ(JOB@IT)