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。

总结

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

相关文章

  • 基于String不可变字符与StringBuilder可变字符的效率问题

    基于String不可变字符与StringBuilder可变字符的效率问题

    这篇文章主要介绍了String不可变字符与StringBuilder可变字符的效率问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • java学生信息管理系统源代码

    java学生信息管理系统源代码

    这篇文章主要为大家详细介绍了java学生信息管理系统源代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Java中Iterator迭代器的使用详解

    Java中Iterator迭代器的使用详解

    在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提供了一个接口java.util.Iterator。本文就来详细说说Iterator迭代器的使用,感兴趣的可以了解一下
    2022-10-10
  • SpringCloud hystrix断路器与全局解耦全面介绍

    SpringCloud hystrix断路器与全局解耦全面介绍

    什么是服务降级?当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作
    2022-10-10
  • Java中如何调用cmd压缩文件

    Java中如何调用cmd压缩文件

    以下是对Java调用cmd压缩文件的实现方法进行了分析介绍,需要的朋友可以参考下
    2013-07-07
  • Java线程同步Lock同步锁代码示例

    Java线程同步Lock同步锁代码示例

    这篇文章主要介绍了Java线程同步Lock同步锁代码示例,首先介绍了Java线程同步的原理,然后对lock同步锁作了简要阐述,分享了代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • SpringBoot多数据源配置并通过注解实现动态切换数据源

    SpringBoot多数据源配置并通过注解实现动态切换数据源

    本文主要介绍了SpringBoot多数据源配置并通过注解实现动态切换数据源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Android开发中Socket通信的基本实现方法讲解

    Android开发中Socket通信的基本实现方法讲解

    这篇文章主要介绍了Android开发中Socket通信的基本实现方法讲解,是安卓上移动互联网程序开发的基础,需要的朋友可以参考下
    2015-12-12
  • Springboot拦截filter中异常的处理

    Springboot拦截filter中异常的处理

    SpringBoot提供了全局异常处理机制可以拦截所有异常,包括Filter中的异常,本文主要介绍了Springboot拦截filter中异常的处理,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • Java 生成带Logo和文字的二维码

    Java 生成带Logo和文字的二维码

    这篇文章主要介绍了Java 生成带Logo和文字的二维码的方法,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-04-04

最新评论