👨🎓作者:bug菌 ✏️博客:CSDN、掘金等 💌公众号:猿圈奇妙屋 🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。 🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。
演示环境:idea2019.3 + springboot 2.3.1REALSE + mysql5.6 + jdk1.8
给大家看个很匪夷所思的bug!sql执行逻辑也很简单,使用if test判断,如果前端传的参数有对应的test字段,则将其加入到判断条件中,但是运行结果差强人意。
看下控制台sql打印:
具体看执行sql的后半段,明显是没有拼接auditorStatus 这个字段条件?
我给大家看下我自定义xml中真正执行的sql语句。
先请大家见晓:
<if test="model.auditorStatus != null and model.auditorStatus != '' ">
and a.audit_state = #{model.auditorStatus}
</if>
判断该字段值如果不为null或者不等于' ',就进行该sql 字段条件拼接。
完整截图如下:
我害怕是判断有问题,把auditorStatus 给过滤掉了,于是我再做个测试,我将auditorStatus 值改为1或别的值(除0外),sql竟能成功拼接该auditorStatus 字段。一脸懵b!我???
此时看控制台执行的sql,auditorStatus = 1是被where 条件成功拼接上,最后返回的结果数也是准确无误的。
字段赋值0就不行,这是为啥啊???见鬼了?
后端用Integer接收的0传入 以model.auditorStatus 这一步进行取值,现在有两种情况,要么值没传进去被判空false,要么if判断 auditorStatus 有值但执行内部逻辑判断时出了问题,前者肯定可以排除,那就只剩后者了,花了一刻钟,查阅相关源码资料才发现,model.auditorStatus != '' 执行结果竟然真的为false,0 != '',这明显为true啊。但是啊底层源码执行却不是简单的是0 与 ''的判断,而是会默认将""和 0 都转换成double进行比较 都是0.0,这也就是为什么 auditorStatus为0却判断auditorStatus != ' ' 会返回false。有空的同学可以重点去研究研究哈。
所以接下来,你们所关心的重点来了,如何去解决这种问题呢?
做法:不用Integer接收,使用String类型接收。
做法:去掉【model.auditorStatus!= ''】 的这条非空判断.
而我是直接采取了方式2,如下是去除model.auditorStatus!= ''这条判断后,model.auditorStatus = 0的情况下,sql也是正常拼接 auditorStatus 这个字段条件。
如下是我修改后再次调用接口debug,给大家看一眼,参数值是否有被 拿到,我这里也是直接定义为0.
如下 是控制台sql打印,大家可以看下:
最后结果返回条数也是正确的,很明显是这一改是没有问题的。大家也可以自行测试一下。