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://www.pswp.cn/diannao/85942.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/85942.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/85942.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI 模型分类全解:特性与选择指南

人工智能&#xff08;AI&#xff09;技术正以前所未有的速度改变着我们的生活和工作方式。AI 模型作为实现人工智能的核心组件&#xff0c;种类繁多&#xff0c;功能各异。从简单的线性回归模型到复杂的深度学习网络&#xff0c;从文本生成到图像识别&#xff0c;AI 模型的应用…

01-python爬虫-第一个爬虫程序

开始学习 python 爬虫 第一个获取使用最多的网站-百度 源代码 并将源代码保存到文件中 from urllib.request import urlopenurl https://www.baidu.com resp urlopen(url)with open(baidu.html, w, encodingutf-8) as f:f.write(resp.read().decode(utf-8))知识点&#xf…

四六级监考《培训学习》+《培训考试》

1 线上注册 &#xff08;网址&#xff1a; https://passport.neea.edu.cn 2 登录培训平台参加线上必修课程学习和考核 &#xff08;平台网址&#xff1a; https://kwstudy.neea.edu.cn 注意选择学员入口&#xff09; 3 考试要求&#xff1a;考试成绩须达应到80分以上&#xf…

回顾Java与数据库的30年历程

当 Java 1.0 于 1996 年推出时&#xff0c;语言和互联网都与今天大不相同。当时&#xff0c;网络主要是静态的&#xff0c;而 Java 承诺通过注入交互式游戏和动画来为网络注入活力&#xff0c;这一承诺极具前景。根据 1995 年写给《连线》杂志的 David Banks 的说法&#xff0c…

simulink有无现成模块可以实现将三个分开的输入合并为一个[1*3]的行向量输出?

提问 simulink有无现成模块可以实现将三个分开的输入合并为一个[1*3]的行向量输出&#xff1f; 回答 Simulink 本身没有一个单独的模块能够直接将三个分开的输入合并成一个 [13] 行向量输出&#xff0c;但是可以通过 组合模块实现你要的效果。 ✅ 推荐方式&#xff1a;Mux …

代码训练LeetCode(24)数组乘积

代码训练(24)LeetCode之数组乘积 Author: Once Day Date: 2025年6月5日 漫漫长路&#xff0c;才刚刚开始… 全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客 参考文章: 238. 除自身以外数组的乘积 - 力扣&#xff08;LeetCode&#xff09;力扣 (LeetCode) 全…

NLP学习路线图(十七):主题模型(LDA)

在浩瀚的文本海洋中航行&#xff0c;人类大脑天然具备发现主题的能力——翻阅几份报纸&#xff0c;我们迅速辨别出"政治"、"体育"、"科技"等板块&#xff1b;浏览社交媒体&#xff0c;我们下意识区分出美食分享、旅行见闻或科技测评。但机器如何…

vue对axios的封装和使用

在 Vue 项目中&#xff0c;使用 axios 进行 HTTP 请求是非常常见的做法。为了提高代码的可维护性、统一错误处理和请求拦截/响应拦截逻辑&#xff0c;对axios进行封装使用。 一、基础封装&#xff08;适用于 Vue 2 / Vue 3&#xff09; 1. 安装 axios npm install axios2. 创…

HTML实现端午节主题网站:龙舟争渡,凭吊祭江诵君赋。

名人说:龙舟争渡,助威呐喊,凭吊祭江诵君赋。——苏轼《六幺令天中节》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、项目概览:传统与现代的技术碰撞1. 核心特性一览2. 网站结构设计二、技术亮点深度解析1. 响应式布局的精妙设计2. CSS动画系统的…

【Redis】笔记|第9节|Redis Stack扩展功能

Redis Stack 扩展功能笔记&#xff08;基于 Redis 7&#xff09; 一、Redis Stack 概述 定位&#xff1a;Redis OSS 扩展模块&#xff08;JSON、搜索、布隆过滤器等&#xff09;&#xff0c;提供高级数据处理能力。核心模块&#xff1a; RedisJSON&#xff1a;原生 JSON 支持…

如何选择专业数据可视化开发工具?为您拆解捷码全功能和落地指南!

分享大纲&#xff1a; 1、捷码核心功能&#xff1a;4维能力支撑大屏开发 2、3步上手&#xff1a;可视化大屏开发操作路径 3、适配场景&#xff1a;8大行业已验证方案 在各行各业要求数字化转型时代&#xff0c;数据可视化大屏已成为众多企业数据驱动的核心工具。面对市场上繁杂…

测试W5500的第11步_使用ARP解析IP地址对应的MAC地址

本文介绍了基于W5500芯片的ARP协议实现方法&#xff0c;详细阐述了ARP请求与回复的工作机制。ARP协议通过广播请求和单播回复实现IP地址与MAC地址的映射&#xff0c;确保局域网设备间的可靠通信。文章提供了完整的STM32F10x开发环境下的代码实现&#xff0c;包括网络初始化、SP…

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…

IDEA 打开文件乱码

问题&#xff1a;文件乱码 底部编码无法切换 解决方案&#xff1a; 第一步 使用Nodepad 查询文件编码 本项目设置为 转为 UTF-8 无 BOM 第二步&#xff1a;在 IntelliJ IDEA 中&#xff1a;右键点击文件 → File Encoding → 选择目标编码&#xff08;如 UTF-8&#xff09; 最…

float、double 这类 浮点数 相比,DECIMAL 是另一种完全不同的数值类型

和 float、double 这类**“浮点数”**相比&#xff0c;DECIMAL 是另一种完全不同的数值类型&#xff0c;叫做&#xff1a; ✅ DECIMAL 是什么&#xff1f; DECIMAL 是“定点数”类型&#xff08;fixed-point&#xff09;&#xff0c;用于存储精确的小数值&#xff0c;比如&…

Java应用10(客户端与服务器通信)

Java客户端与服务器通信 Java提供了多种方式来实现客户端与服务器之间的通信&#xff0c;下面我将介绍几种常见的方法&#xff1a; 1. 基于Socket的基本通信 服务器端代码 import java.io.*; import java.net.*;public class SimpleServer {public static void main(String…

pytorch基本运算-范数

引言 前序学习进程中&#xff0c;已经对pytorch基本运算有了详细探索&#xff0c;文章链接有&#xff1a; 基本运算 广播失效 乘除法和幂运算 hadamard积、点积和矩阵乘法 上述计算都是以pytorch张量为运算元素&#xff0c;这些张量基本上也集中在一维向量和二维矩阵&#x…

EasyRTC音视频实时通话助力新一代WebP2P视频物联网应用解决方案

一、方案背景​ 物联网技术深刻变革各行业&#xff0c;视频物联在智慧城市、工业监控等场景广泛应用。传统方案依赖中心服务器中转&#xff0c;存在传输效率低、网络负载大的问题。新一代WebP2P视频物联技术实现设备直连&#xff0c;降低网络压力并提升传输效率&#xff0c;成…

DAY 15 复习日

浙大疏锦行 数据使用爬虫爬取weibo数据&#xff0c;下面是代码 import datetime import os import csv import timeimport numpy as np import random import re import urllib.parse import requests from fake_useragent import UserAgentdef init():if not os.path.exists…

SSL/TLS 协议详解:安全通信的基石

一、概述 SSL&#xff08;Secure Sockets Layer&#xff09; 及其继任者 TLS&#xff08;Transport Layer Security&#xff09; 是位于 传输层&#xff08;TCP&#xff09;与应用层之间 的加密协议&#xff0c;用于在网络通信中实现 机密性、身份认证和数据完整性。 核心目标…