未修改前的 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查询实现的注意事项