MyBatis使用<foreach>标签like查询报错解决问题

 更新时间:2024年03月09日 14:55:44   作者:Charge8  
这篇文章主要介绍了MyBatis使用<foreach>标签like查询报错解决问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

动态SQL使用可查看官方文档:

一、foreach标签 IN查询

<foreach>标签使用场景最多的就是在构建 IN 条件语句的时候进行遍历集合。

实例如下:

    List<UserDO> getByIds(@Param("ids") List<Long> ids);


    <select id="getByIds" resultMap="BaseResultMap">
      SELECT * FROM t_user
      WHERE id IN
      <foreach collection="ids" item="id" separator="," open="(" close=")">
        #{id}
      </foreach>
    </select>

单元测试:访问是OK。

    @Test
    public void testGetByIds() {
        List<Long> ids = Arrays.asList(1L, 2L, 3L);
        List<UserDO> userDOList = userMapper.getByIds(ids);
        System.out.println(userDOList);
    }

二、foreach标签 like查询

按照上面的使用,如果有个业务需要用到 LIKE遍历查询时。

我们通过在<foreach>标签中构建 LIKE 条件语句进行遍历集合时,竟然出错了

实例代码:

  List<UserDO> getLikeByUsername(@Param("userNameList") List<String> userNameList);


  <select id="getLikeByUsername" resultMap="BaseResultMap">
    SELECT * FROM t_user
    WHERE
    <foreach collection="userNameList" item="userName" separator="OR" open="(" close=")">
      user_name LIKE concat('%', #{userName}, '%')
    </foreach>
  </select>

单元测试:

    @Test
    public void testGetLikeByUsername() {
        List<String> userNameList = Arrays.asList("赵", "后", "赵云");
        List<UserDO> userDOList = userMapper.getLikeByUsername(userNameList);

        System.out.println(userDOList);
    }

报错信息如下:

在 foreach标签中取值出的错,网上查阅资料说是因为 parameterType接收的参数不是List导致的,具体情况未核实。

解决方案

解决方法比较简单,或一种取值方式即可,将 foreach标签中遍历出来的值换如下方式获取。

user_name LIKE concat('%',concat(#{userName},'%')) -- 个人比较推荐使用
user_name LIKE concat(‘%', #{userNameList[${idx}]}, ‘%')

SQL语句如下:

<select id="getLikeByUsername" resultMap="BaseResultMap">
  SELECT * FROM t_user
  WHERE
  <foreach collection="userNameList" item="userName" separator="OR" open="(" close=")" index="idx">
    user_name LIKE concat('%',concat(#{userName},'%'))
    --       user_name LIKE concat('%', #{userNameList[${idx}]}, '%')
  </foreach>
</select>

如果你想使用注解方式的话,mapper如下:

    @Select({"<script>",
            "SELECT * FROM t_user\n" +
                    "    WHERE\n" +
                    "    <foreach collection=\"userNameList\" item=\"userName\" separator=\"OR\" open=\"(\" close=\")\">\n" +
                    "      user_name LIKE concat('%',concat(#{userName},'%'))\n" +
                    "    </foreach>",
            "</script>"})
    List<UserDO> getLikeByUsername2(@Param("userNameList") List<String> userNameList);

再次访问单元测试OK。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • IDEA2020 1.1中Plugins加载不出来的问题及解决方法

    IDEA2020 1.1中Plugins加载不出来的问题及解决方法

    这篇文章主要介绍了IDEA2020 1.1中Plugins加载不出来的问题,本文还给大家提到了IDEA 2020.1.1 找不到程序包和符号的问题,感兴趣的朋友跟随小编一起看看吧
    2020-06-06
  • Java Spring读取和存储详细操作

    Java Spring读取和存储详细操作

    这篇文章主要介绍了Spring读取和存储详细操作,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • Java类加载的过程详解

    Java类加载的过程详解

    这篇文章主要介绍了深入理解Java 类加载全过程的相关资料,小编觉得写的还不错,需要的朋友可以参考下,希望能够给你带来帮助
    2021-09-09
  • java9区分opens与exports

    java9区分opens与exports

    本篇文章主要给大家讲述了java9中opens与exports的区别以及用法的不同之处,一起学习下吧。
    2018-02-02
  • JavaGUI界面实现页面跳转方法

    JavaGUI界面实现页面跳转方法

    这篇文章主要给大家介绍了关于JavaGUI界面实现页面跳转的相关资料, GUI是指图形用户界面,指采用图形方式显示的计算机操作用户界面,需要的朋友可以参考下
    2023-07-07
  • 基于dubbo中Listener的实现方法

    基于dubbo中Listener的实现方法

    下面小编就为大家带来一篇基于dubbo中Listener的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • SpringBoot实现六边形架构的三种不同方式详解

    SpringBoot实现六边形架构的三种不同方式详解

    六边形架构,也被称为端口与适配器架构或洋葱架构,是一种将业务逻辑与外部依赖解耦的架构模式,本文将介绍在SpringBoot中实现六边形架构的三种不同方式
    2025-06-06
  • Redisson分布式锁原理深入分析

    Redisson分布式锁原理深入分析

    文章介绍了Redisson分布式锁的工作原理,并详细解释了加锁、续期、解锁的核心流程,Redisson利用Redis的单线程、自动续期和Lua脚本原子性等特点,避免了传统锁常见的死锁、锁争用和误删等问题,此外,还总结了使用Redisson分布式锁时的注意事项和避坑点
    2026-04-04
  • MyBatis-Plus 默认不更新null的4种方法

    MyBatis-Plus 默认不更新null的4种方法

    本文主要介绍了MyBatis-Plus 默认不更新null的4种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-01-01
  • IntelliJ IDEA中设置数据库连接全局共享的步骤详解

    IntelliJ IDEA中设置数据库连接全局共享的步骤详解

    本文详解IntelliJ IDEA数据库连接全局共享设置,通过创建/选择数据源并设为全局,实现多项目间统一连接,提升效率、减少配置错误,感兴趣的可以了解一下
    2025-07-07

最新评论