• 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。

    在这里插入图片描述

    – 求知若饥,虚心若愚。

  • 相关阅读:
    linux日志
    redis解决缓存与数据库双写一致性问题代码实现
    文举论金:黄金原油全面走势分析策略独家指导
    JS(javascript)面试题 7点一次过 => 必会之八股文
    YOLO算法改进5【中阶改进篇】:添加SENet注意力机制
    C#winform导出DataGridView数据到Excel表
    安防视频监控/视频汇聚平台EasyCVR服务重启,海康SDK设备无法上线是什么原因?
    如何使用BERT生成单词嵌入?
    idea+docker+jenkins+git构建自动化部署java项目
    应用--WebApplication
  • 原文地址:https://blog.csdn.net/qq_42402854/article/details/127956257