MyBatis 的问题

三分钟冷血 2015-12-13 02:17:10
在我自定义的sql中 ,有这样 两个 <if test>,其中isPartiCated 为Integer型,值为0
<if test="isPartiCated != null and isPartiCated != '' ">
and su.isPartiCated = #{isPartiCated}
</if>
<if test="isPartiCated == null or isPartiCated == '' ">
and su.isPartiCated is null
</if>
为何一直进入的是第二个if,也就是<if test="isPartiCated == null or isPartiCated == '' ">,
有人能解答下吗?或者告诉我怎么去查找<if test>的源码,我找不到。
在线等 。
小弟,先谢谢各位看官了!!!
...全文
15861 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
跳动的字符 2019-02-13
  • 打赏
  • 举报
回复
引用 楼主 三分钟冷血 的回复:
在我自定义的sql中 ,有这样 两个 <if test>,其中isPartiCated 为Integer型,值为0
<if test="isPartiCated != null and isPartiCated != '' ">
and su.isPartiCated = #{isPartiCated}
</if>
<if test="isPartiCated == null or isPartiCated == '' ">
and su.isPartiCated is null
</if>
为何一直进入的是第二个if,也就是<if test="isPartiCated == null or isPartiCated == '' ">,
有人能解答下吗?或者告诉我怎么去查找<if test>的源码,我找不到。
在线等 。
小弟,先谢谢各位看官了!!!


---------------------------------------------------------------
我来补充解答下:
楼主的问题是为什么一直进入的都是第二个if,原因是 isPartiCated == '' 这个判断一直返回为true;
原因是mybatis比较Integer(0)和空字符串“”的时候,会把两者都转换成double类型,既0.0。

详细源码分析,可以看这里:
https://www.cnblogs.com/dirgo/p/9481882.html


fcgdxtzlh 2016-05-03
  • 打赏
  • 举报
回复
引用 11 楼 shijing266 的回复:
[quote=引用 8 楼 PCCEO1 的回复:] 我为了纠结这个问题,周末过来调查了半天,企图通过Mybatis的源码看出问题,然而Mybatis对于这些标签是使用了ONGL,我也没有找到对应的解析代码,对于问题的解决方法我知道,就是只去判断是否为null,但是我更想知道底层是怎么判断的,以此提高能力。 对于二位的假想,我做了如下测试,好像结果并不太符合这个猜想,大家交流下再,能找到源码就好了 嘿嘿
java程序里面,Integer是引用类型,初始值肯定是null, 你设定为0,肯定不为null的,但是在mybatis里面,你传入参数是int,作为参数处理,他的初始值就是0. ,你传入0,默认为空的[/quote] 感觉本楼说的比较靠谱,但是和楼主一样,求源码出处
  • 打赏
  • 举报
回复
引用 8 楼 PCCEO1 的回复:
我为了纠结这个问题,周末过来调查了半天,企图通过Mybatis的源码看出问题,然而Mybatis对于这些标签是使用了ONGL,我也没有找到对应的解析代码,对于问题的解决方法我知道,就是只去判断是否为null,但是我更想知道底层是怎么判断的,以此提高能力。 对于二位的假想,我做了如下测试,好像结果并不太符合这个猜想,大家交流下再,能找到源码就好了 嘿嘿
java程序里面,Integer是引用类型,初始值肯定是null, 你设定为0,肯定不为null的,但是在mybatis里面,你传入参数是int,作为参数处理,他的初始值就是0. ,你传入0,默认为空的
hadoop333 2015-12-15
  • 打赏
  • 举报
回复
引用 9 楼 PCCEO1 的回复:
[quote=引用 5 楼 xiesq5112 的回复:] 这类问题我之前也遇到过。但不记得具体是什么了、 这里我的猜想是这样的: 这跟类型有关,你这里的这个isPartiCated 是Integer类型的, <if test="isPartiCated != null and isPartiCated != '' "> and su.isPartiCated = #{isPartiCated} </if> <if test="isPartiCated == null or isPartiCated == '' "> and su.isPartiCated is null </if> 它执行的 ispartiCated ==null 返回 true,因为Integer类型的初始值不是null,而是0 建议:判断对象是否为空,用 <c:if test="${empty ispartiCated }"> isPartiCated is null </c:if>
亲,解决方法我知道,就是去掉 =='' 的判定即可,但是我更想从框架源码的角度找到问题所在,关于大家的猜想,我做了测试,麻烦你看一下#8楼,咱在研究研究[/quote] 什么去掉==即可啊 正确的应该怎么写啊 去掉哪个==啊
三分钟冷血 2015-12-15
  • 打赏
  • 举报
回复
引用 5 楼 xiesq5112 的回复:
这类问题我之前也遇到过。但不记得具体是什么了、 这里我的猜想是这样的: 这跟类型有关,你这里的这个isPartiCated 是Integer类型的, <if test="isPartiCated != null and isPartiCated != '' "> and su.isPartiCated = #{isPartiCated} </if> <if test="isPartiCated == null or isPartiCated == '' "> and su.isPartiCated is null </if> 它执行的 ispartiCated ==null 返回 true,因为Integer类型的初始值不是null,而是0 建议:判断对象是否为空,用 <c:if test="${empty ispartiCated }"> isPartiCated is null </c:if>
亲,解决方法我知道,就是去掉 =='' 的判定即可,但是我更想从框架源码的角度找到问题所在,关于大家的猜想,我做了测试,麻烦你看一下#8楼,咱在研究研究
三分钟冷血 2015-12-15
  • 打赏
  • 举报
回复
引用 7 楼 shijing266 的回复:
[quote=引用 3 楼 PCCEO1 的回复:]
日 人都哪去了


亲,昨天休假呢[/quote]
我为了纠结这个问题,周末过来调查了半天,企图通过Mybatis的源码看出问题,然而Mybatis对于这些标签是使用了ONGL,我也没有找到对应的解析代码,对于问题的解决方法我知道,就是只去判断是否为null,但是我更想知道底层是怎么判断的,以此提高能力。
对于二位的假想,我做了如下测试,好像结果并不太符合这个猜想,大家交流下再,能找到源码就好了 嘿嘿
三分钟冷血 2015-12-15
  • 打赏
  • 举报
回复
引用 11 楼 shijing266 的回复:
[quote=引用 8 楼 PCCEO1 的回复:] 我为了纠结这个问题,周末过来调查了半天,企图通过Mybatis的源码看出问题,然而Mybatis对于这些标签是使用了ONGL,我也没有找到对应的解析代码,对于问题的解决方法我知道,就是只去判断是否为null,但是我更想知道底层是怎么判断的,以此提高能力。 对于二位的假想,我做了如下测试,好像结果并不太符合这个猜想,大家交流下再,能找到源码就好了 嘿嘿
java程序里面,Integer是引用类型,初始值肯定是null, 你设定为0,肯定不为null的,但是在mybatis里面,你传入参数是int,作为参数处理,他的初始值就是0. ,你传入0,默认为空的[/quote] 这位兄台,能否帮我找到源码?相对于怎样解决,我对底层封装更感兴趣
三分钟冷血 2015-12-15
  • 打赏
  • 举报
回复
引用 10 楼 hadoop333 的回复:
[quote=引用 9 楼 PCCEO1 的回复:] [quote=引用 5 楼 xiesq5112 的回复:] 这类问题我之前也遇到过。但不记得具体是什么了、 这里我的猜想是这样的: 这跟类型有关,你这里的这个isPartiCated 是Integer类型的, <if test="isPartiCated != null and isPartiCated != '' "> and su.isPartiCated = #{isPartiCated} </if> <if test="isPartiCated == null or isPartiCated == '' "> and su.isPartiCated is null </if> 它执行的 ispartiCated ==null 返回 true,因为Integer类型的初始值不是null,而是0 建议:判断对象是否为空,用 <c:if test="${empty ispartiCated }"> isPartiCated is null </c:if>
亲,解决方法我知道,就是去掉 =='' 的判定即可,但是我更想从框架源码的角度找到问题所在,关于大家的猜想,我做了测试,麻烦你看一下#8楼,咱在研究研究[/quote] 什么去掉==即可啊 正确的应该怎么写啊 去掉哪个==啊[/quote] 就是对于Integer 的判断,<if: test 只需要判断 == null 或者!= null
  • 打赏
  • 举报
回复
引用 3 楼 PCCEO1 的回复:
日 人都哪去了
亲,昨天休假呢
  • 打赏
  • 举报
回复
Integer的初始值是0,当你传入0 的时候,他会当做你没有传参数,当做null处理 解决办法:改成String 参数
心随自在飞 2015-12-14
  • 打赏
  • 举报
回复
这类问题我之前也遇到过。但不记得具体是什么了、 这里我的猜想是这样的: 这跟类型有关,你这里的这个isPartiCated 是Integer类型的, <if test="isPartiCated != null and isPartiCated != '' "> and su.isPartiCated = #{isPartiCated} </if> <if test="isPartiCated == null or isPartiCated == '' "> and su.isPartiCated is null </if> 它执行的 ispartiCated ==null 返回 true,因为Integer类型的初始值不是null,而是0 建议:判断对象是否为空,用 <c:if test="${empty ispartiCated }"> isPartiCated is null </c:if>
tony4geek 2015-12-14
  • 打赏
  • 举报
回复
这样看不出来哪里出了问题。
三分钟冷血 2015-12-13
  • 打赏
  • 举报
回复
日 人都哪去了
三分钟冷血 2015-12-13
  • 打赏
  • 举报
回复
anybody help me
三分钟冷血 2015-12-13
  • 打赏
  • 举报
回复
come on!

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧