MyBatis使用<foreach>標簽like查詢報錯解決問題
動態(tài)SQL使用可查看官方文檔:
一、foreach標簽 IN查詢
<foreach>標簽使用場景最多的就是在構(gòu)建 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查詢
按照上面的使用,如果有個業(yè)務(wù)需要用到 LIKE遍歷查詢時。
我們通過在<foreach>標簽中構(gòu)建 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標簽中取值出的錯,網(wǎng)上查閱資料說是因為 parameterType接收的參數(shù)不是List導(dǎo)致的,具體情況未核實。
解決方案
解決方法比較簡單,或一種取值方式即可,將 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。

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
IDEA2020 1.1中Plugins加載不出來的問題及解決方法
這篇文章主要介紹了IDEA2020 1.1中Plugins加載不出來的問題,本文還給大家提到了IDEA 2020.1.1 找不到程序包和符號的問題,感興趣的朋友跟隨小編一起看看吧2020-06-06
JavaGUI界面實現(xiàn)頁面跳轉(zhuǎn)方法
這篇文章主要給大家介紹了關(guān)于JavaGUI界面實現(xiàn)頁面跳轉(zhuǎn)的相關(guān)資料, GUI是指圖形用戶界面,指采用圖形方式顯示的計算機操作用戶界面,需要的朋友可以參考下2023-07-07
SpringBoot實現(xiàn)六邊形架構(gòu)的三種不同方式詳解
六邊形架構(gòu),也被稱為端口與適配器架構(gòu)或洋蔥架構(gòu),是一種將業(yè)務(wù)邏輯與外部依賴解耦的架構(gòu)模式,本文將介紹在SpringBoot中實現(xiàn)六邊形架構(gòu)的三種不同方式2025-06-06
IntelliJ IDEA中設(shè)置數(shù)據(jù)庫連接全局共享的步驟詳解
本文詳解IntelliJ IDEA數(shù)據(jù)庫連接全局共享設(shè)置,通過創(chuàng)建/選擇數(shù)據(jù)源并設(shè)為全局,實現(xiàn)多項目間統(tǒng)一連接,提升效率、減少配置錯誤,感興趣的可以了解一下2025-07-07

