Mybatis實現條件IN查詢(foreach)和invalid comparison異常
foreach標籤
foreach屬性主要有item,index,collection,open,separator,close。
1、item表示集合中每一個元素進行迭代時的別名,
2、index指定一個名字,用於表示在迭代過程中,每次迭代到的位置,
3、open表示該語句以什麼開始,
4、separator表示在每次進行迭代之間以什麼符號作為分隔符,
5、close表示以什麼結束,
6、collection屬性,該屬性是必須指定的,但是在不同情況下,該屬性的值是不一樣:
a、如果傳入的是單引數且引數型別是一個List的時候,collection屬性值為list .
b、如果傳入的是單引數且引數型別是一個array陣列的時候,collection的屬性值為array .
c、如果傳入的引數是多個的時候,我們就需要把它們封裝成一個Map了,當然單引數也可以封裝成map,實際上如果你在傳入引數的時候,在MyBatis裡面也是會把它封裝成一個Map的,map的key就是引數名,所以這個時候collection屬性值就是傳入的List或array物件在自己封裝的map裡面的key.
具體講解如下
1. findByIds(List ids)
如果引數的型別是List, 則在使用時,collection屬性要必須指定為 list
<select id="findByIdsMap" resultMap="BaseResultMap">
Select
<include refid="Base_Column_List" />
from jria where ID in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</select>
2:findByIds(Long[] ids)
如果引數的型別是Array,則在使用時,collection屬性要必須指定為 array
<select id="findByIdsMap" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from tabs where ID in
<foreach item="item" index="index" collection="array" open="(" separator="," close=")">
#{item}
</foreach>
</select>
3. findBy
當查詢的引數有多個時:
這種情況需要特別注意,在傳引數時,一定要改用Map方式, 這樣在collection屬性可以指定名稱
<select id="findBy" resultMap="RfCustomerMemMap" parameterType="java.util.Map">
SELECT
<include refid="Column"/>
FROM rfl_customer_mem a LEFT JOIN rfl_loan b ON a.member_no = b.loan_member_no
WHERE a.member_no = #{memberNo} AND b.status IN
<foreach collection="status" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
<if test="name != null and name != ''">
AND name = #{name}
</if>
<if test="idNumber != null and idNumber != ''">
AND id_number = #{idNumber}
</if>
<if test="mobileNo != null and mobileNo != ''">
AND mobile_no = #{mobileNo}
</if>
<if test="loanNo != null and loanNo != ''">
AND loan_no = #{loanNo}
</if>
order by a.id DESC
<if test="offset > -1 and rows > -1">
limit #{offset},#{limit}
</if>
</select>
public List<LoanMerchantMemEntity> findMerchantMemBy(String merchantName, String merchantNo, String socialCreditCode, String loanNo, int offset, int limit) {
List<LoanMerchantMemEntity> list = new ArrayList<LoanMerchantMemEntity>();
Map<String, Object> filter = new HashMap<String, Object>();
filter.put("merchantName", merchantName);
filter.put("socialCreditCode", socialCreditCode);
filter.put("status", statsList());
filter.put("loanNo", loanNo);
filter.put("offset", offset);
filter.put("limit", limit);
filter.put("merchantNo", merchantNo);
try {
List<LoanMerchantMemEntity> row = loanMerchantMemDao.findBy(filter);
} catch (Exception e) {
LOGGER.error(filter, "查詢企業會員資訊異常", e);
}
return list;
}
static List<String> statsList(){
List<String> statusList = new ArrayList<String>();
statusList.add("SUCCESS");
statusList.add("DUE");
statusList.add("OVER");
return statusList;
}
java.lang.IllegalArgumentException: invalid comparison: java.util.ArrayList and java.lang.String
分析原因發現是對test的判斷存在錯誤。
錯誤程式碼如下:
<if test="bankIds != null and bankIds != ''">
and bank_id in
<foreach item="item" index="index" collection="bankIds" open="(" separator="," close=")">
#{item}
</foreach>
</if>
正確程式碼如下:
<if test="bankIds != null and bankIds.size > 0">
and bank_id in
<foreach item="item" index="index" collection="bankIds" open="(" separator="," close=")">
#{item}
</foreach>
</if>
MyBatis 佔位符#和 $ 的區別
#符號將傳入的資料都當做一個字串,會對自動傳入的資料加一個雙引號;
$ 符號將傳入的資料直接顯示生成 SQL 中;
#符號存在預編譯的過程對問號賦值,防止 SQL 注入;
$ 符號是直譯的方式,一般用在 order by ${列名}語句中;
能用#號就不要用 $ 符號,$符號主要用於order by
相關文章
- 【mybatis-plus】條件查詢MyBatis
- mybatis-plus QueryWrapper條件查詢器MyBatisAPP
- 使用mybatis example 和 java 8的特性來實現多表關聯且帶有查詢條件的查詢MyBatisJava
- gorm 使用map實現in 條件查詢用法GoORM
- Mybatis學習筆記 3:Mybatis 多種條件查詢MyBatis筆記
- mybatis lambdaQuery 查詢條件導致空指標MyBatis指標
- mysql條件查詢MySql
- MongoDB查詢條件MongoDB
- mybatis plus 使用LambdaQueryWrapper設定複雜的條件查詢MyBatisAPP
- Mybatis-技術專區-Criteria的and和or進行聯合條件查詢MyBatis
- hibernate異常之--count查詢異常
- Laravel 多條件查詢Laravel
- ORACLE 查詢條件出現關鍵字:&Oracle
- 實現 MyBatis 流式查詢的方法MyBatis
- 查詢條件和條數,先查詢兩條免費的,後面為vip
- SpringBoot Jpa多條件查詢Spring Boot
- AntDesignBlazor示例——列表查詢條件Blazor
- golang beego orm 查詢條件 or andGolangORM
- Javaweb-DQL-條件查詢JavaWeb
- 查詢條件封裝物件封裝物件
- mongodb條件查詢不等於MongoDB
- SSH實現客戶按條件查詢\上傳檔案等
- 寫一個“特殊”的查詢構造器 – (四、條件查詢:複雜條件)
- 20240719資料庫關聯查詢、條件查詢資料庫
- 34. 過濾條件、多表查詢、子查詢
- mybatis-plus連線SQL Server2012分頁查詢異常MyBatisSQLServer
- mybatis 根據多個id查詢資料 foreach標籤MyBatis
- Linq查詢之多個排序條件排序
- Linq兩個from查詢條件
- 菜品條件分頁查詢
- hyperf關聯模型條件查詢模型
- mysql拆分字串做條件查詢MySql字串
- SQL-基礎語法 - 條件查詢 - 模糊查詢SQL
- 異常-自定義異常的實現和測試
- MyBatis學習筆記(四)使用map實現查詢和插入MyBatis筆記
- mysql多條件過濾查詢之mysq高階查詢MySql
- MybatisPlus入門(五)MybatisPlus條件查詢MyBatis
- Vue請求介面查詢條件拼接Vue