Mybatis中一條SQL使用兩個foreach的問題
阿新 • • 發佈:2019-01-05
未修改前的 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 >
這裡注意一個點,我兩個 foreach
的 collection
引數都是:array
;
這在只有一個 foreach
的情況下,程式碼是能跑通的,沒錯我後臺給的引數是一個 int[]
;
因為業務需求,我又加了一個 foreach
,同樣, collection
引數給的還是:array
;
但是,執行時程式碼就報錯了,報錯如下:
???啥情況,四個引數???我只給了兩個引數啊!?SQL
兩個引數,Dao
層我也沒給 4
個啊
這個 array
引數是個什麼鬼?
最後,差不多邊查邊改了兩個多小時,發現問題;
將foreach
的collection
引數值分別改為對應的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>
跑是跑通了,但是這樣只是
知其然不知其所以然
,於是我在網上查閱了下資料,果然:
當查詢有多個引數時,foreach
的collection
屬性可以指定名稱;
查閱文章為:Mybatis List列表In查詢實現的注意事項