首页 > 其他分享 >Mybatis-plus构建wrapper条件时出现索引越界异常Caused by: org.apache.ibatis.exceptions.PersistenceException: ### E

Mybatis-plus构建wrapper条件时出现索引越界异常Caused by: org.apache.ibatis.exceptions.PersistenceException: ### E

时间:2024-03-17 21:01:50浏览次数:30  
标签:java 构造方法 -- DefaultSqlSession ibatis apache org id ###

项目场景:

学习springboot整合mybatis-plus时通过构建器执行相关操作

@Autowired
BookMapper mapper;

@Test
void test(){
    QueryWrapper<Book> wrapper = new QueryWrapper<>();
    wrapper
            .select("id", "name", "press") //只查询前三个字段
            .gt("id", 1 ) //只要id>1的列
            .like("name","%计算机%"); //名字中有计算机的
    System.out.println(mapper.selectList(wrapper));
}

问题描述

控制台出现索引越界异常

### Error querying database.  Cause: java.lang.IndexOutOfBoundsException: Index 3 out of bounds for length 3
### The error may exist in com/lmw/mapper/BookMapper.java (best guess)
### The error may involve com.lmw.mapper.BookMapper.selectList
### The error occurred while handling results
### SQL: SELECT   id,name,press   FROM tb_book      WHERE  (id > ? AND name LIKE ?)
### Cause: java.lang.IndexOutOfBoundsException: Index 3 out of bounds for length 3
    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:156)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)
    ... 11 more

此时将构建器中的select条件去掉,竟然执行成功了


原因分析:

查看控制台的SQL日志

Preparing: SELECT id,name,press,author FROM tb_book WHERE (id > ? AND name LIKE ?)

如果去掉 select() 就是查询全部列(成功),不去掉就是查询指定列(报错)

分析代码执行流程:传入构建器wrapper--构建SQL语句--生成对应筛选where条件--返回select指定列数据--封装成实体类对象--输出

因此可以判断问题出在 select返回指定列数据--封装成实体类对象 这一步

然而这一步骤是通过调用实体类的构造方法完成的,此时我们进入实体类查看:

可以注意到类名上面打上了 @AllArgsConstructor 注解,该注解的作用相当于为这个类指定了一个全字段构造方法,到这里报错的原因大概就能知道了

由于我们指定了一个全字段的构造方法,且并没有其他无参或有参的构造方法,那么在mybatis-plus替我们封装数据的时候就会出问题:我们只拿到了其中的几列数据,但构造器要求我们提供所有的字段数据,自然就报错了。至于为什么是索引越界异常,我的猜想:

mapper执行完查询后返回的是一个有序的数据集合,每一个列占一个索引,在封装成对象的时候,调用一个仅有全字段构造方法,此时构造方法会从返回的数据集合中读取相应的字段,读取到一半时,集合中的数据已经读完了,但构造方法还没结束,所以继续往下读,此时便发生了索引越界异常。

纯个人猜想,欢迎指正~


解决方案:

1.去掉@AllArgsConstructor注解,此时会有一个默认的无参构造方法

    

@Data
@TableName("tb_book")
//@AllArgsConstructor
public class Book {
        ...
}

2.手动加上一个无参构造方法

@Data
@TableName("tb_book")
@AllArgsConstructor
public class Book {

   public Book(){
        
   }
        
   ...

}

测试运行,可以看到两种方法都执行成功了

标签:java,构造方法,--,DefaultSqlSession,ibatis,apache,org,id,###
From: https://blog.csdn.net/laiminwei/article/details/136783479

相关文章

  • 1秒AI出图的时代来了!Stable Diffusion WebUI Forge+SVD整合包
    速度快N倍!StableDiffusionWebUIForge整合包要说今年绘画圈最大的新秀那妥妥的就StableDiffution本次更新的StableDiffusionWebUIForge整合包+SVD比之前推送的更加智能、快速和简单有多简单呢?这么说吧之前的版本需要初中生级别现在的的幕后网整合包加强版小......
  • 猫头虎分享已解决Bug | org.springframework.dao.DuplicateKeyException异常的正确解
    博主猫头虎的技术世界......
  • Seatunnel系列之:Apache Iceberg sink connector和往Iceberg同步数据任务示例
    Seatunnel系列之:ApacheIcebergsinkconnector和往Iceberg同步数据任务示例一、支持的Iceberg版本二、支持的引擎三、描述四、支持的数据源信息五、数据库依赖六、数据类型映射七、Sink选项八、往Iceberg同步数据任务示例一、支持的Iceberg版本1.4.2二......
  • 搭建Apache+PHP+MySQL的Web服务器环境测试PHP时找不到url对象
    检查了apache的服务都是正常运行,配置文件也没有问题,搜了很多方法还是一样,最后发现是新建文本文档时重命名后(文件管理器没有显示后缀名)没有修改文件后缀。关键检查php的隐藏后缀名有没有更改!!!问题的发现浏览器输入http://localhost返回发现目录下我以为是first.php的文件实际上的......
  • Apache DolphinScheduler-3.2.0集群部署教程
    集群部署方案(2Master+3Worker)ApacheDolphinScheduler官网:https://dolphinscheduler.apache.org/zh-cnApacheDolphinScheduler使用文档:https://dolphinscheduler.apache.org/zh-cn/docs/3.2.0截止2024-01-19,最新版本:3.2.0部署版本:apache-dolphinscheduler-3.2.0-bin.t......
  • java: 程序包com.sun.org.slf4j.internal不存在
    java:程序包com.sun.org.slf4j.internal不存在事件之由来问题之分析处理之方案收工事件之由来拉完别人的项目后,启动不了了,报错提示:java:程序包com.sun.org.slf4j.internal不存在1问题之分析就是别人用lombok了同时使用slf4j和lombok的时候会出现这个问题原因是slf4j和lombok自......
  • 2-AP-14: Create procedures with parameters to organize code and make it easier t
        ChapterModule/LessonBigIdeas/Topics/ConceptsStandards(CSTA)LearningObjectivesChapter1Module1,Lesson1Sequences,ProblemSolving1A-AP-10:Developprogramswithsequencesandsimpleloops,toexpressideasoraddress......
  • apache2.4在windows server2012上出现内存溢出解决方法
    今天把服务器迁移到windowsserver2012发现出现web请求不稳定,内存飙升,经常发生卡顿现象,找了很多原因,最后找到了关键因素。在apache的配置文件httd.conf下注释掉:EnableMMAPoffEnableSendfileOffAcceptFilterhttpnoneAcceptFilterhttpsnone这样就搞定了! 现......
  • CF387B George and Round 题解
    考虑采用双指针法解决此题。首先需要对\(a,b\)数组排序,并且维护两个指针\(l,r\),分别指向\(a,b\)两个数组中的元素。接着循环移动\(r\)指针,每次都尝试匹配\(a_l\)和\(b_r\):若\(a_l\leb_r\),则说明\(a_l=b_r\)或可以采用减少\(b_r\)的方式使\(a_l=b_r\),这......
  • Tomcat警告异常:org.apache.tomcat.util.descriptor
    警告信息org.apache.tomcat.util.descriptor.web.WebXml.setVersion未知版本字符串[4.0]。将使用默认版本。这个是说Tomcat版本跟Web.xml文件版本不匹配。解决方案Tomcat8.5.x版本使用的是Web.xml版本3.1Tomcat9.x版本开始支持Web.xml版本4.0两个方案,一个是使用匹配版......