【mybatis】-- if标签判断字符串相等时失效

本文讲述了在MyBatis中遇到的一个关于字符串判断条件不生效的问题,详细分析了问题的原因并提供了解决方案。作者在mapper的SQL语句中发现if标签的条件判断未按预期工作,经过排查确定是MyBatis的映射问题。通过调整if条件的写法,如使用`sign=='1'.toString()`,成功解决了问题,使得接口返回结果正常。

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

原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 &gt; #{startDate}
			and last_modified_date &lt;= #{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 &gt; #{startDate}
			and last_modified_date &lt;= #{endDate}
	</select>

结果返回正常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值