原mapper的sql语句如下:
<select id="countOutFinishedOrdersByDeliverSign" resultType="int" >
select
count(1) cnt
from
order_customer
where
status = #{status}
<if test="sign!=null and sign!='' and sign=='1'">
AND tms_delivery_flag is null
</if>
<if test="sign!=null and sign!='' and sign=='2'">
AND tms_delivery_flag = 1
</if>
and last_modified_date > #{startDate}
and last_modified_date <= #{endDate}
</select>
以上:sign是字符串,判断等于的条件时,使用了sign=='1' 和sign=='2'
由于项目暂时还没有集成p6spy,没办法打印出sql,所以,自己按照条件拼接的sql语句到Navicat中执行,条件不一样,执行结果也不一样。但是程序接口返回的结果集却是一样的。
分析原因:
sql没有问题,查询结果没有问题。然后尝试去掉了其中的判断条件 AND tms_delivery_flag is null 或者 AND tms_delivery_flag = 1,发现sql查询结果是一样的,也就是说这个条件在查询中就没有发挥实际的作用。
综上认为:mybatis在if判断时,映射出了问题。
于是搜索mybatis判断字符串相等:
mybatis 映射文件中,if标签判断字符串相等,两种方式:因为mybatis映射文件,是使用的ognl表达式,所以在判断字符串sex变量是否是字符串Y的时候使用
<test="sex=='Y'.toString()">或者<test = 'sex== "Y"'>
修改if条件:
<select id="countOutFinishedOrdersByDeliverSign" resultType="int" >
select
count(1) cnt
from
order_customer
where
status = #{status}
<if test="sign!=null and sign!='' and sign=='1'.toString()">
AND tms_delivery_flag is null
</if>
<if test="sign!=null and sign!='' and sign=='2'.toString()">
AND tms_delivery_flag = 1
</if>
and last_modified_date > #{startDate}
and last_modified_date <= #{endDate}
</select>
结果返回正常。
来源:oschina
链接:https://my.oschina.net/u/4346166/blog/4780309