记一次mybatis的坑:Error attempting to get column ‘XXX‘ from result set. Cause: java.sql.SQLException:

本文详述了一起在使用Oracle数据库和MyBatis进行查询时遇到的异常情况。问题源于实体类的构造方法不完整,导致MyBatis在映射查询结果时出现问题。通过逐步排查,发现是手动创建的有参构造方法覆盖了默认无参构造方法,进而引发数据类型不匹配和数据越界异常。解决方案是为实体类添加无参构造方法。此案例提醒开发者注意MyBatis中实体类构造方法的使用,避免类似问题的发生。
摘要由CSDN通过智能技术生成

1、使用的是Oracle数据库,插入数据时正常,但是查询时,却报异常,而且还是类型不支持

如下:

对比一下实体类的数据类型和表的数据类型,完全一致,不存在类型不一致问题

2、层层分析:

2.1 原来的SQL

select   *    from 表名 where id=#{id}

2.2 把报错的字段剔除,不进行查询:

id ,name,userid, downloadtime, depname,rowsnumber  from 表名 where id=#{id}

2.3 本来只查询6条记录!结果!结果出乎意料

title字段竟然还是进行了查询,总共7条!!!!

大致结果如下:

id=0000000013,
name=张三, 
userid=fzhangsan, 
downloadtime=Mon May 16 19:45:45 CST 2022,
depname=人事部, 
title=人事部,
rowsnumber=7, 

而且title的值竟然与上一个字段"depname"重复了!

2.4 对SQL语句再进行改造测试,只查询2个字段

id ,name,userid from 表名 where id=#{id}

结果!又出来了新的异常!数据越界

Cause: java.lang.IndexOutOfBoundsException: Index 2 out of bounds for length 2

如图:

 3、原因及解决方法

原因:我的实体类手动生成了有参的构造方法,且该构造方法的参数不是完整的!

而mybatis在进行查询时,会自动加载无参的构造方法,此时我手动创建了有参的构造方法,导致无参构造方法已经覆盖了!

解决方法:手动添加无参构造方法即可

4、总结

4.1 使用mybatis时,需要注意实体类的无参构造方法是否存在,不要被覆盖了!

4.2 以前都是使用lombok的@Data注解,默认构造方法会存在的,一般不会出现这个问题

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

睡竹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值