当前位置: 首页 > news >正文

mybatis的if判断==‘1‘不生效,改成‘1‘.toString()才生效的原因

mybatis的xml文件中的if判断==‘1’不生效,改成’1’.toString()才生效

Mapper接口传入的参数

    List<Table> queryList(@Param("state") String state);

xml内容

<where><if test="state != null and state == '1'">AND EXISTS(select 1 from t_space.base_outlay where outlay_card_no = t1.outlay_card_no)</if>AND EXISTS(select 2 from t_space.base_outlay where outlay_card_no = t1.outlay_card_no)
</where>

select 1的sql一直没进到,能确定state就是1,改成<if test="state != null and state == '1'">或者<if test='state != null and state == "1">问题成功解决,网上大量博客未说明原因,如:参考1|参考2
多次询问ai给出如下原因有点说服力:

总结的就是:

在 MyBatis 的 OGNL 或 SpEL 表达式引擎中,写法 == ‘1’ 中的 ‘1’ 被解析为 Character 类型(char),而不是字符串!
而你传入的参数 state是 String 类型,所以比较时会出现 类型不一致导致判断失败:
String(“1”) == Character(‘1’) ❌ 不成立

以下是灵码给的原因:

明白了,你发现:<if test="state != null and state == '1'"> ❌ 不生效
<if test="state != null and state == '1'.toString()"> ✅ 生效了
这说明你在 MyBatis 的 EL 表达式中遇到了类型匹配问题。我们来深入分析原因。🧪 问题本质:'1' 和 '1'.toString() 在 MyBatis EL 中的类型不同
在 Java 中:java
'1'        // 是 char 类型(注意是单引号)
"1"        // 是 String 类型(双引号)
"1".toString() == "1"  // 成立
但在 MyBatis 的 OGNL 或 SpEL 表达式引擎中,写法 == '1' 中的 '1' 被解析为 Character 类型(char),而不是字符串!而你传入的参数 state 是 String 类型,所以比较时会出现 类型不一致导致判断失败:java
String("1") == Character('1') ❌ 不成立
当你写成:xml
state == '1'.toString()
此时 '1'.toString() 返回的是字符串 "1",两边就都是 String 类型了,比较就能成功。✅ 正确写法推荐
为了避免这种陷阱,建议统一使用双引号表示字符串:xml
<if test="state != null and state == '1'">
应该改为:xml
<if test="state != null and state == '1'.toString()">
或者更清晰地写成:xml
<if test="state != null and state == '1'.toString().intern()">
但最推荐的是:xml
<if test="state != null and outlayAddAble.equals('1')">
⚠️ 注意:在 MyBatis 的表达式中,使用 .equals() 比 == 更安全,因为 == 判断的是引用地址,.equals() 才是值比较。✅ 最佳实践总结
写法	是否推荐	原因
state == '1'	❌ 不推荐	'1' 是 char 类型,和 String 不匹配
state == '1'.toString()	✅ 推荐	强制转成 String 类型比较
outlayAddAble.equals('1')	✅✅ 强烈推荐	使用 .equals() 进行值比较,语义正确
outlayAddAble.toString() == '1'	⚠️ 避免	== 是引用比较,容易出错
outlayAddAble.toString().equals('1')	✅ 推荐	安全通用
✅ 推荐最终写法
xml
<if test="state != null and outlayAddAble.equals('1')">AND EXISTS(select 1 from t_space.base_outlay where outlay_card_no = t1.outlay_card_no)
</if>
这样可以确保:参数是字符串;
比较是值比较;
不受底层表达式引擎对 '1' 解析为 char 的影响。
如果你还有疑问或需要进一步验证,可以把生成的 SQL 日志贴出来一起分析。

文章转载自:

http://XmFvicDv.byywt.cn
http://PkPAhLpB.byywt.cn
http://XRzvusPr.byywt.cn
http://FyeNPHKM.byywt.cn
http://YH87VOqg.byywt.cn
http://Gr55CgcP.byywt.cn
http://iRX4IwG1.byywt.cn
http://EukmGHt2.byywt.cn
http://K0YzgEyT.byywt.cn
http://iumQ7v7b.byywt.cn
http://cGgXzOh9.byywt.cn
http://q8KpWPzY.byywt.cn
http://npmhOpDT.byywt.cn
http://PVt7NuvM.byywt.cn
http://3yYoDrpA.byywt.cn
http://0Yweoa92.byywt.cn
http://cww5gd0i.byywt.cn
http://dgBitq2c.byywt.cn
http://dvQIVsbW.byywt.cn
http://HInpJy8w.byywt.cn
http://3R4guJwv.byywt.cn
http://42gS5Klo.byywt.cn
http://GqCGrEH7.byywt.cn
http://Q4G0pyLt.byywt.cn
http://AnYL47fz.byywt.cn
http://jQvrTyrS.byywt.cn
http://s5dKEtCS.byywt.cn
http://ZYro8cVM.byywt.cn
http://gVUonqQz.byywt.cn
http://I0C7IXmP.byywt.cn
http://www.dtcms.com/a/235930.html

相关文章:

  • 【MCP实践】Python构建MCP应用全攻略:从入门到实战
  • 2025五大免费变声器推荐!
  • C语言三位数倒序输出(两种方法)
  • 使用pwm控制一个舵机摆动的速度
  • 5.4.3树和森林的遍历
  • Caliper 配置文件解析:fisco-bcos.json
  • 极空间z4pro配置gitea mysql,内网穿透
  • 3.lombok
  • 汉诺塔问题深度解析
  • 【Block总结】EBlock,快速傅里叶变换(FFT)增强输入图像的幅度|即插即用|CVPR2025
  • 【AI】智驾地图在不同自动驾驶等级中的作用演变
  • python时间操作笔记
  • VBA之Excel应用第四章第四节:单元格对象的Clear方法和Count属性
  • Gojs渲染实线、虚线
  • JavaScript 中的单例内置对象:Global 与 Math 的深度解析
  • RFC8489-STUN
  • [蓝桥杯]解谜游戏
  • 凌晨四点的星光
  • Delphi 实现远程连接 Access 数据库的指南
  • MySQL基础(一)介绍、下载及安装
  • Hubstudio浏览器如何使用Loongproxy?
  • libGL error
  • MS8258D 高增益带宽积 FET 输入放大器/激光雷达接收跨阻放大器
  • arcpy与扩展模块
  • Android Test3 获取的ANDROID_ID值不同
  • kubeadm安装k8s
  • 2024年第十五届蓝桥杯青少Scratch初级组-国赛—画矩形
  • 2003-2024年高铁列车信息数据
  • JeecgBoot低代码管理平台
  • 【图论 强连通分量】P1653 [USACO04DEC] Cow Ski Area G|普及+