MyBatis错误

embedded/2024/9/22 19:19:44/

说明:记录一次MyBatis错误,错误信息如下,说数字转换异常,显然,把一个字符串类型转为数字类型,肯定是不行的。

2024-08-29 19:44:43.198 ERROR 24216 --- [nio-9090-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.NumberFormatException: For input string: "hezy"
### Cause: java.lang.NumberFormatException: For input string: "hezy"] with root causejava.lang.NumberFormatException: For input string: "hezy"

在这里插入图片描述

场景

(前端)

在这里插入图片描述

(接口)

java">    @GetMapping("/test")public void test() {User user = new User();user.setId(1);user.setUsername("hezy");userRepository.selectUserById(user);}

(Repository)

java">    User selectUserById(@Param("user") User user);

定位到项目的动态SQL,如下,这是我本地复现的Demo,在实际的项目中,是一个查询条件字段,表示某个分组,可选“所有分组“或者”具体某个分组“,当时的开发应该是和前端约定过,当值为0时表示为所有分组,所以这个字段传递可能是0,或者是具体的分组ID,因此就有了类似下面这样的判断

(动态SQL)

    <select id="selectUserById" resultType="com.hezy.pojo.User">SELECT * FROM i_users WHERE id = #{user.id}<if test="user.username != null and user.username != '' and user.username != '0'">and username = #{user.username}</if><if test="user.username == '0'">and username = '0'</if></select>

分析&解决

显然,这里是有隐型的类型转换,但一眼看过去,动态SQL里面的判断都是字符串,0也用单引号包起来了。无计可施之际,我想到单引号在Java中表示的是字符,而字符又能自动转为数字进行计算,如下,所以我想是不是MyBatis底层把’0’当做数字了,然后把左边的参数也尝试转为数值类型,造成了这次错误。

在这里插入图片描述

于是,我想到把0通过双引号包起来,这铁定就是字符串了,双引号在XML里面需要通过&quot;转义,如下:

    <select id="selectUserById" resultType="com.hezy.pojo.User">SELECT * FROM i_users WHERE id = #{user.id}<if test="user.username != null and user.username != '' and user.username != &quot;0&quot;">and username = #{user.username}</if><if test="user.username == &quot;0&quot;">and username = '0'</if></select>

成功了,golder~,这个问题困扰了很久

在这里插入图片描述

解决:if标签里面对数值的判断,如果你想要的是判断字符串,右边的数值需要用&quot;包起来。


http://www.ppmy.cn/embedded/102992.html

相关文章

P2403 [SDOI2010] 所驼门王的宝藏

~~~~~ P2403 [SDOI2010] 所驼门王的宝藏 ~~~~~ 总题单链接 讲解 ~~~~~ 这道题的关键在于如何连边。 ~~~~~ 对于“横天门”和“纵寰门”建虚点即可。 ~~~~~ 对于“任意门”&#xff0c;用一个 vector 存每行有哪些点&#xff0c;然后二分。 ~~~~~ 连完边之后缩点&#xff0c;然…

一些关于Vue2的面试题

1.v-if和v-show的区别&#xff1f; v-show通过css中的display控制隐藏和显示&#xff0c;v-if是真的渲染和销毁 如果显示隐藏切换比较频繁&#xff0c;使用v-show&#xff0c;否则使用v-if 2.为什么v-for要使用key&#xff1f; 快速找到节点&#xff0c;减少渲染次数&#…

深度学习:革新药物心脏毒性预测的新篇章

药物研发是一项充满挑战与风险的领域&#xff0c;尽管科学家们投入大量时间与资源&#xff0c;但仍有高达90%的药物因无法通过临床试验而宣告失败。其中&#xff0c;药物的心脏毒性是一个尤为棘手的问题&#xff0c;不少药物在上市后因被发现对心脏有潜在伤害而被迫召回&#x…

一、菜单扩展

一、创建文件夹 创建一个名为Editor的文件夹。unity会默认这个名字为工程文件夹 二、创建代码 实现点击unity菜单&#xff0c;对应代码的方法 引用命名空间&#xff1b;使用这个menuitem 注&#xff1a;必须有一个子路径&#xff0c;不然会报错 这里是这个方法的参数 每一个…

CSS 的object-position属性的作用规则

object-position CSS 属性用于指定替换元素&#xff08;如 <img> 或 <video>&#xff09;的内容在其容器内的对齐方式。这个属性与 object-fit 紧密相关&#xff0c;因为 object-fit 控制了内容如何适应其容器的大小&#xff0c;而 object-position 则决定了内容在…

Java 泛型与增强for

泛型 泛型就是在集合中指定存储的数据类型&#xff0c;而且只能存储这种类型&#xff0c;在List<类型>必须要指定&#xff0c;ArrayList<>可以指定可以不指定&#xff0c;基本数据类型不能作为泛型。 确定了泛型为 String&#xff0c;调用该方法时传递的参数类型也…

PyQt 迁移到 PySide

将 PyQt 迁移到 PySide 的过程主要包括以下几个步骤。PySide 和 PyQt 的 API 基本相似&#xff0c;但是仍有一些细微的差别。下面是一些通用的迁移步骤&#xff1a; 1. 安装 PySide 首先&#xff0c;你需要安装 PySide2 或 PySide6&#xff08;取决于你希望使用的版本&#x…

SSRF漏洞(三)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言&#xff1a; 本文基于pikachu&#xff08;皮卡丘&#xff09;靶场进行SSRF渗透攻击教学。 靶场环境搭建&#xff1a;SSRF漏洞&#xff08;三&#xff09; 一&#xff0c;SSR…