解决Mybatis出现报错Error querying database.Cause: java.lang.IndexOutOfBoundsException: Index 9 out of

 更新时间:2024年05月21日 09:02:28   作者:初心绘流年  
这篇文章主要介绍了解决Mybatis出现报错Error querying database.Cause: java.lang.IndexOutOfBoundsException: Index 9 out of,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

错误现象

确认SQL没有任何问题,但是在执行时仍然出现以下报错,报错下标越界:IndexOutOfBoundsException: Index 9 out of bounds for length 9

18:02:19.449 [http-nio-8007-exec-10] DEBUG c.t.c.c.d.GyUserWithdrawDao.listWihdraw - ==>  Preparing: SELECT gyw.*, ui.realname realname FROM `gy_user_withdraw` gyw inner join user_info ui on gyw.user_id = ui.userid LIMIT ? 
18:02:19.450 [http-nio-8007-exec-10] DEBUG c.t.c.c.d.GyUserWithdrawDao.listWihdraw - ==> Parameters: 10(Integer)
18:02:19.466 [http-nio-8007-exec-10] ERROR c.t.c.exception.ExceptionHandlerAdvice - 运行异常
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.IndexOutOfBoundsException: Index 9 out of bounds for length 9
### The error may exist in file [D:\CIMS\gyyh_2.3.3\cims_commons_db\target\classes\mybatis\mysql\GyUserWithdrawMapper.xml]
### The error may involve com.trusfort.cims.commons.dao.GyUserWithdrawDao.listWihdraw
### The error occurred while handling results
### SQL: SELECT gyw.*, ui.realname realname FROM `gy_user_withdraw` gyw inner join user_info ui on gyw.user_id = ui.userid LIMIT ?
### Cause: java.lang.IndexOutOfBoundsException: Index 9 out of bounds for length 9
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:440)
    at com.sun.proxy.$Proxy172.selectList(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:223)
    at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:147)
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:80)
    at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:144)
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:85)
    at com.sun.proxy.$Proxy369.listWihdraw(Unknown Source)

错误原因

很明显不是SQL的问题,从日志来看SQL明显没有问题,而且我们的Mapper.xml中配置也没有问题

<select id="listWihdraw" resultType="GyUserWithdraw">
    SELECT gyw.*, ui.realname realname FROM `gy_user_withdraw` gyw inner join user_info ui on gyw.user_id = ui.userid
</select>

那就只能从Mybatis执行SQL后查询结果到实体映射的角度出发来考虑了。

我们看一下我们的实体类源码

@Data
@Builder(toBuilder = true)
public class GyUserWithdraw implements Serializable {
    private String id;
    private String userId;
    private String employeenum;
    private String statusBefore;
    private String statusAfter;
    private String syncResult;
    private Date createTime;
    private Date updateTime;
}

看着貌似是没什么毛病,但鉴于我们此处偷懒使用了Lombok的插件,还是仔细考虑回想一下

我们一般写数据库实体类的时候,只要有字段定义和对应的getter、setter方法就可以了

为何用了Lombok的@Data注解之后有问题了呢?

我们看一下编译后的实体类,用IDEA查看一下class反编译的结果

重点来了

我们会发现与原本不使用Lombok的实体类相比,该类只有一个全参数的构造方法,而原本我们手写实体类时只写了getter和setter方法,所以编译后会默认带一个无参构造。

而上述使用Lombok的@Builder注解后,编译后实体有全参数的构造方法,那么编译器就不会再默认提供一个默认的无参构造。

所以问题可能就出现在这个无参构造方法缺失上,mybatis在将查询结果映射成实体时是通过无参构造获得一个实例,然后调用setter方法将值存入相应字段的。

解决方案

我们可以使用Lombok注解@NoArgsConstructor@AllArgsConstructor,使编译器编译的时候提供出无参构造。

在原实体上增加两个注解即可,我们再重试就会发现SQL执行正常了。

@Data
@Builder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor

注意:

因为我们使用@Builder注解,所以光添加一个@NoArgsConstructor,程序会编译报错的,builder需要一个全参构造,所以我们还得加上@AllArgsConstructor

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java enum 对枚举元素的赋值和取值方式

    Java enum 对枚举元素的赋值和取值方式

    这篇文章主要介绍了Java enum 对枚举元素的赋值和取值方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java synchronized从使用到底层锁升级机制详解

    Java synchronized从使用到底层锁升级机制详解

    本文深入解析Java中synchronized的底层机制与锁升级过程,文章从基础用法入手,区分实例锁、类锁和代码块锁的使用场景及常见误区,感兴趣的朋友跟随小编一起看看吧
    2026-03-03
  • Java多线程之线程安全问题详细解析

    Java多线程之线程安全问题详细解析

    这篇文章主要给大家介绍了关于Java多线程之线程安全问题的相关资料,Java多线程中线程安全问题是一个常见的问题,因为多个线程可能同时访问共享的资源,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • Java中的this、super、final关键字详解

    Java中的this、super、final关键字详解

    这篇文章主要介绍了Java中的this、super、final关键字详解,它在方法内部使用,表示这个方法所属对象的引用,它在构造器内部使用,表示该构造器正在初始化的对象,this 可以调用类的属性、方法和构造器,需要的朋友可以参考下
    2023-09-09
  • Java算法之冒泡排序实例代码

    Java算法之冒泡排序实例代码

    今天小编就为大家分享一篇关于Java算法之冒泡排序实例代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Java多线程父线程向子线程传值问题及解决

    Java多线程父线程向子线程传值问题及解决

    文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDecorator、ExecutorConfig、RequestContextHolder+TaskDecorator、MDC+TaskDecorator和InheritableThreadLocal
    2025-02-02
  • SpringBoot如何配置文件给bean赋值问题

    SpringBoot如何配置文件给bean赋值问题

    这篇文章主要介绍了SpringBoot如何配置文件给bean赋值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • IDEA对使用了第三方依赖jar包的非Maven项目打jar包的问题(图文详解)

    IDEA对使用了第三方依赖jar包的非Maven项目打jar包的问题(图文详解)

    这篇文章主要介绍了IDEA对使用了第三方依赖jar包的非Maven项目打jar包的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • SpringBoot整合WebService服务的实现代码

    SpringBoot整合WebService服务的实现代码

    WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络应用间的交互,这篇文章主要介绍了SpringBoot整合WebService服务的实例代码,需要的朋友可以参考下
    2022-02-02
  • java中如何截取字符串最后一位

    java中如何截取字符串最后一位

    这篇文章主要介绍了java中如何截取字符串最后一位的实现方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07

最新评论