我是靠谱客的博主 任性绿茶,最近开发中收集的这篇文章主要介绍MyBatis使用<foreach>标签like查询报错解决一、foreach标签 IN查询二、foreach标签 like查询,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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

一、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导致的,具体情况未核实。

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>

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

    @Select({"<script>",
            "SELECT * FROM t_usern" +
                    "    WHEREn" +
                    "    <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。

在这里插入图片描述

– 求知若饥,虚心若愚。

最后

以上就是任性绿茶为你收集整理的MyBatis使用<foreach>标签like查询报错解决一、foreach标签 IN查询二、foreach标签 like查询的全部内容,希望文章能够帮你解决MyBatis使用<foreach>标签like查询报错解决一、foreach标签 IN查询二、foreach标签 like查询所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部