Mybatis中一条SQL使用两个foreach的问题及解决
一条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>
这里注意一个点,我两个 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查询实现的注意事项
foreach执行多条sql报错的解决
今天在用mybatis执行foreach更新操作时报了奇怪的错误.sql语句是没有任何问题的.sql拿出来直接能运行.但是mybatis就是不能运行.
而我传递一条数据的话mybatis能运行,但是两条以上数据就会报错
后来发现是mysql不支持执行多条sql语句.为此需要再数据源后面加上一句话.就可以执行多条sql了
&allowMultiQueries=true
上一篇:基于java springboot + mybatis实现电影售票管理系统
栏 目:JAVA代码
本文标题:Mybatis中一条SQL使用两个foreach的问题及解决
本文地址:http://www.codeinn.net/misctech/205720.html
阅读排行
- 1Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type异常
- 2Java Swing组件BoxLayout布局用法示例
- 3Java邮件发送程序(可以同时发给多个地址、可以带附件)
- 4java中-jar 与nohup的对比
- 5深入理解Java中的克隆
- 6Java中自定义异常详解及实例代码
- 7java读取excel文件的两种方法
- 8解析SpringSecurity+JWT认证流程实现
- 9spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)
- 10深入解析java虚拟机