mybatis if test 为0时不筛选

在查询库位列表时,遇到Mybatis if test 为0时未正确筛选的问题。原本期望当库位类型为0时过滤数据,但实际查询了所有数据。问题在于Mybatis将空字符串转换为0进行比较,导致筛选失效。通过查看源码并参考相关文章,理解了这一行为,并决定记录下来以避免将来再次犯错。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天,根据库位类型查询 库位列表 出现问题。

当库位类型functions传值:0时,并没有按照"0"进行帅选,而是查出了所有的数据。

 

-----实际执行的查询---
select id id, shelf_order shelfOrder,functions functions,customer_id customerId,state state from location where state=1 and deleted=0;

---期望下面的查询---
select id id, shelf_order shelfOrder,functions functions,customer_id customerId,state state from location where state=1 and deleted=0 and functions=0;

 

mapper.xml内容:

select id id, shelf_order shelfOrder,functions functions,customer_id customerId,state state from  location
where state=1 and deleted=0
<if test="functions!=null and functions!=''">
	and functions = #{functions}
</if>

改成下面:

select id id, shelf_order shelfOrder,functions functions,customer_id customerId,state state from  location
where state=1 and deleted=0
<if test="functions!=null and (functions!='' or functions ==0)">
	and functions = #{functions}
</if>

以前出现过类似的错误,但是又再次犯错。特此记录一下。

问题分析:

首先他会获取两个判断对象的类型,当拿一个字符串和一个数字判断的时候,因为类型不一样嘛,当Mybatis发现,这个字符串是可以转换成数字的,那么就会把这个字符串转成数字,然后再和这个数字判断。

那么问题就来了,这个空字符串会转换成什么数字呢?

从源码

OgnlOps.compareWithConversion

就可以看出,这个空字符串,是会被转成0的.所以现在一切豁然开朗.

 

参考文章;

https://www.jianshu.com/p/732839a2f532

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值