iBatisにおけるin条件の厳密な書き方(listが空の場合)
5579 ワード
シナリオの説明
OracleはSQL文を問合せます.in条件は例外が発生しやすく、リストまたは配列が空の場合はin()が発生し、実行すると例外が放出されます.
書き方を誤る
<isNotEmpty property="idList">
id in
<iterate property="idList" open="(" close=")" conjunction=",">
iterate>
isNotEmpty>
考えてみて、listが空の場合、つなぎ合わせた文はwhere col=1 and.、予想されるwhere col=1 and id in(‘1’,‘2’)は現れず、異常を投げます.ORA-00936:式が欠落しています.
間違った書き方2
<isNotEmpty property="idList">
<iterate property="idList" open="id in (" close=")" conjunction=",">
iterate>
isNotEmpty>
空のリストを入力すると、リストに要素がないため、iterateラベルは無効になります(条件生成は無視されます).このような結果は非常に深刻で、もともと1つの空のリストで、データがないはずなのに、すべてのデータを取得することになりました!
正しい書き方の模範
<isPropertyAvailable prepend="and" property="idList">
<isNotEmpty property="idList">
<iterate property="idList" open="Id in (" close=")" conjunction=",">
iterate>
isNotEmpty>
<isEmpty property="idList">
1 ]]>
isEmpty>
isPropertyAvailable>
Oracleのin句には長さの制限があるため、項目数の多いクエリーでは、次の形式(orの形式につづる)に変更します.
<isPropertyAvailable prepend="and" property="idList">
<isNotEmpty property="idList">
<iterate property="idList" open="(" close=")" conjunction="or">
iterate>
isNotEmpty>
<isEmpty property="idList">
1 ]]>
isEmpty>
isPropertyAvailable>
まず、isPropertyAvailableタグでHashMapにidListというリストパラメータがあるかどうかを判断し(isNotEmptyは直接使用できません.空のリストはisEmptyとみなされるためです)、isNotEmptyとisEmptyで分類判断します.isNotEmptyでは、もちろん私たちがよく知っているコードです.一方、isEmpty(iBatis中空リストとNullはisEmptyとみなされる)では、Falseの永遠の条件「1<>1」をつづるだけでよい.inは空のリストであり、SQLでは直接「id in()」と書くことはできないが、inは空のリストで永遠に偽の条件であるため、「1<>1」で代用することができる.