iBatisにおけるin条件の厳密な書き方(listが空の場合)


シナリオの説明


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」で代用することができる.