记一次:Mybatis 判断 Integer类型,值为0动态SQL不生效
场景是这样的:
select * from tableName
where 1=1
<if test="status!=null and status!=''">and `status` = #{status}</if>
我的status是这样定义的:0-待审核,1-已通过,2-已驳回,3-未认证
之前一直没发现这个BUG是因为: 1-待审核,2-已通过,3-已驳回,4-未认证
只有当status=0的时候这个动态SQL才不生效!!!好奇怪!
那这就是这个0在作怪了。
通过Mybatis源码的分析知道:
mybatis在预编译sql时,使用OGNL表达式来解析if标签,对于Integer类型属性,在判断不等于’ '时,例如我写的那样 status != ’ ',OGNL会返回 ’ ’ 的长度,
源码:
故 表达式status != ’ '会被当做status != 0来判断,所以当status=0时,if条件判断不通过,动态SQL也就不生效啦。
我们只需要将status!=’ '条件去掉就可以解决上面这个问题。至于代码中的业务逻辑,看看能不能在service中处理吧。。。
翻到了一篇比较好的博客解释,分享一下:
Mybatis if判断Integer类型的值不等于’‘引发的问题(!=’'等价于!=0)