Mybatis中一条SQL使用两个foreach的问题及解决

 更新时间:2022年02月08日 10:15:00   作者:坑货行不行  
这篇文章主要介绍了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中的Phaser使用详解

    Java中的Phaser使用详解

    这篇文章主要介绍了Java中的Phaser使用详解,与其他障碍不同,注册在phaser上进行同步的parties数量可能会随时间变化,任务可以随时进行注册,需要的朋友可以参考下
    2023-11-11
  • 在Spring Boot中如何使用log4j记录日志

    在Spring Boot中如何使用log4j记录日志

    这篇文章主要介绍如何在spring boot中引入log4j,以及一些基础用法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-02-02
  • springboot jta atomikos实现分布式事物管理

    springboot jta atomikos实现分布式事物管理

    这篇文章主要介绍了springboot jta atomikos实现分布式事物管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java日常练习题,每天进步一点点(47)

    Java日常练习题,每天进步一点点(47)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-08-08
  • Jenkins配置自动发送邮件过程图解

    Jenkins配置自动发送邮件过程图解

    这篇文章主要介绍了jenkins配置自动发送邮件过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • JAVA多线程实现的四种方式及使用场景详解

    JAVA多线程实现的四种方式及使用场景详解

    这篇文章主要介绍了JAVA多线程实现的四种方式及使用场景,并举例说明了在管理系统中多线程的应用场景,如数据导入导出、数据缓存更新、并发用户操作处理、系统监控和定时任务执行,需要的朋友可以参考下
    2025-01-01
  • Java集合之HashMap用法详解

    Java集合之HashMap用法详解

    这篇文章主要介绍了Java集合之HashMap用法,结合实例形式分析了java map集合中HashMap定义、遍历等相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • 使用Maven搭建Hadoop开发环境

    使用Maven搭建Hadoop开发环境

    这篇文章主要介绍了使用Maven搭建Hadoop开发环境的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 基于Java文件输入输出流实现文件上传下载功能

    基于Java文件输入输出流实现文件上传下载功能

    这篇文章主要为大家详细介绍了基于Java文件输入输出流实现文件上传下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • Java动态代理详解及实例

    Java动态代理详解及实例

    这篇文章主要介绍了Java动态代理详解及实例的相关资料,需要的朋友可以参考下
    2017-01-01

最新评论