1. 程式人生 > >Mybatis中一條SQL使用兩個foreach的問題

Mybatis中一條SQL使用兩個foreach的問題

未修改前的 SQL 語句:

<select id="findQuestionType_3_correct" resultType="map">
    SELECT q.`id`, q.`questionContent`, GROUP_CONCAT(o.`questionOption`) AS questionOptionList 
    FROM `exam_question` q
    INNER JOIN `exam_question_option` o ON q.`id` = o.`questionId` 
    WHERE q.`id` IN 
        <foreach item="ids_1"
collection="array" open="(" separator="," close=")" > #{ids_1} </foreach> AND q.`questionType` = 3 AND o.`correct` = 1 GROUP BY FIELD(q.`id`, <foreach item="ids_2" collection="array" separator="," > #{ids_2} </foreach> ) </select
>

這裡注意一個點,我兩個 foreachcollection 引數都是:array
這在只有一個 foreach 的情況下,程式碼是能跑通的,沒錯我後臺給的引數是一個 int[]
因為業務需求,我又加了一個 foreach,同樣, collection 引數給的還是:array
但是,執行時程式碼就報錯了,報錯如下:
報錯
???啥情況,四個引數???我只給了兩個引數啊!?SQL 兩個引數,Dao 層我也沒給 4 個啊
Dao層
這個 array 引數是個什麼鬼?

最後,差不多邊查邊改了兩個多小時,發現問題;
foreachcollection 引數值分別改為對應的 ids_1

ids_2,即可;
程式碼如下:

<select id="findQuestionType_3_correct" resultType="map">
    SELECT q.`id`, q.`questionContent`, GROUP_CONCAT(o.`questionOption`) AS questionOptionList 
    FROM `exam_question` q 
    INNER JOIN `exam_question_option` o ON q.`id` = o.`questionId` 
    WHERE q.`id` IN 
        <foreach item="ids_1" collection="ids_1" open="(" separator="," close=")" >
            #{ids_1}
        </foreach> 
        AND q.`questionType` = 3 AND o.`correct` = 1 
    GROUP BY FIELD(q.`id`, 
        <foreach item="ids_2" collection="ids_2" separator="," >
            #{ids_2}
        </foreach> 
    )
</select>

跑是跑通了,但是這樣只是 知其然不知其所以然,於是我在網上查閱了下資料,果然:
當查詢有多個引數時,foreachcollection 屬性可以指定名稱;
查閱文章為:Mybatis List列表In查詢實現的注意事項