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


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

    官方-动态SQL:https://mybatis.org/mybatis-3/zh/dynamic-sql.html

    一、foreach标签 IN查询

    标签使用场景最多的就是在构建 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    单元测试:访问是OK。

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

    二、foreach标签 like查询

    按照上面的使用,如果有个业务需要用到 LIKE遍历查询时。我们通过在标签中构建 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    单元测试:

        @Test
        public void testGetLikeByUsername() {
            List<String> userNameList = Arrays.asList("赵", "后", "赵云");
            List<UserDO> userDOList = userMapper.getLikeByUsername(userNameList);
    
            System.out.println(userDOList);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    报错信息如下:

    在这里插入图片描述

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

    1、解决方案

    解决方法比较简单,或一种取值方式即可,将 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

        @Select({""})
        List<UserDO> getLikeByUsername2(@Param("userNameList") List<String> userNameList);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    再次访问单元测试OK。

    在这里插入图片描述

    – 求知若饥,虚心若愚。

  • 相关阅读:
    【面试题 - springcloud】 Hystrix
    痞子衡嵌入式:说说职业生涯第一个十年
    2022-2028年全球与中国太阳能光伏消费产品市场现状及未来发展趋势分析报告
    Phillweston 自动驾驶 决策规划算法 面经
    黑马点评-异步秒杀实现
    20231027 基于STM32mp157a 的内核与应用层通过子系统控制led灯,以及计时器功能
    CTFhub-SSRF-内网访问
    biocParallel学习
    Flutter笔记 - ListTile组件及其应用
    互融云区块链溯源防伪系统开发,超高并发,全程追溯
  • 原文地址:https://blog.csdn.net/qq_42402854/article/details/127956257