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可变字符的效率问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-07-07
SpringCloud hystrix断路器与全局解耦全面介绍
什么是服务降级?当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作2022-10-10
SpringBoot多数据源配置并通过注解实现动态切换数据源
本文主要介绍了SpringBoot多数据源配置并通过注解实现动态切换数据源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2022-08-08


最新评论