MyBatis使用<foreach>標(biāo)簽like查詢報(bào)錯(cuò)解決問題
動(dòng)態(tài)SQL使用可查看官方文檔:
一、foreach標(biāo)簽 IN查詢
<foreach>標(biāo)簽使用場(chǎng)景最多的就是在構(gòu)建 IN 條件語句的時(shí)候進(jìn)行遍歷集合。
實(shí)例如下:
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>
單元測(cè)試:訪問是OK。
@Test public void testGetByIds() { List<Long> ids = Arrays.asList(1L, 2L, 3L); List<UserDO> userDOList = userMapper.getByIds(ids); System.out.println(userDOList); }
二、foreach標(biāo)簽 like查詢
按照上面的使用,如果有個(gè)業(yè)務(wù)需要用到 LIKE遍歷查詢時(shí)。
我們通過在<foreach>標(biāo)簽中構(gòu)建 LIKE 條件語句進(jìn)行遍歷集合時(shí),竟然出錯(cuò)了
實(shí)例代碼:
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>
單元測(cè)試:
@Test public void testGetLikeByUsername() { List<String> userNameList = Arrays.asList("趙", "后", "趙云"); List<UserDO> userDOList = userMapper.getLikeByUsername(userNameList); System.out.println(userDOList); }
報(bào)錯(cuò)信息如下:
在 foreach標(biāo)簽中取值出的錯(cuò),網(wǎng)上查閱資料說是因?yàn)?parameterType接收的參數(shù)不是List導(dǎo)致的,具體情況未核實(shí)。
解決方案
解決方法比較簡(jiǎn)單,或一種取值方式即可,將 foreach標(biāo)簽中遍歷出來的值換如下方式獲取。
user_name LIKE concat('%',concat(#{userName},'%')) -- 個(gè)人比較推薦使用 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);
再次訪問單元測(cè)試OK。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于String不可變字符與StringBuilder可變字符的效率問題
這篇文章主要介紹了String不可變字符與StringBuilder可變字符的效率問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07SpringCloud?hystrix斷路器與全局解耦全面介紹
什么是服務(wù)降級(jí)?當(dāng)服務(wù)器壓力劇增的情況下,根據(jù)實(shí)際業(yè)務(wù)情況及流量,對(duì)一些服務(wù)和頁面有策略的不處理或換種簡(jiǎn)單的方式處理,從而釋放服務(wù)器資源以保證核心交易正常運(yùn)作或高效運(yùn)作2022-10-10SpringBoot多數(shù)據(jù)源配置并通過注解實(shí)現(xiàn)動(dòng)態(tài)切換數(shù)據(jù)源
本文主要介紹了SpringBoot多數(shù)據(jù)源配置并通過注解實(shí)現(xiàn)動(dòng)態(tài)切換數(shù)據(jù)源,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Android開發(fā)中Socket通信的基本實(shí)現(xiàn)方法講解
這篇文章主要介紹了Android開發(fā)中Socket通信的基本實(shí)現(xiàn)方法講解,是安卓上移動(dòng)互聯(lián)網(wǎng)程序開發(fā)的基礎(chǔ),需要的朋友可以參考下2015-12-12