异常信息
今天开发一个功能的时候,statement返回的结果集绑定到resultType时一直报错:索引越界
The error occurred while handling results …
Cause: java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
伪代码
// dto对象中有三个属性
public class Dto{
String a;
String b;
String c;
public Dto(String a, String b, String c){
// xxx
}
}
// xml statement中的sql
select b, c from table_x ...
处理
可以看到是在结果集的处理上出现了问题,临时通过在SQL中添加一列解决了问题.后续通过mybatis源码得知是构造函数导致的.
dto中添加了一个三参的构造函数,却忘了补无参构造,补上无参构造即可
.
结果集的处理过程中有如下处理逻辑:
默认构造函数就是无参构造:
没有默认构造函数时,会调用 createByConstructorSignature
,也就是if判断的最后一个分支:
上面代码可以看到,由于dto中只有一个三参的构造,而返回的结果集中只有两列,所以rsw.getColumnNames().get(2)
时会索引越界.
解决办法1:将rsw结果集的列改为三列(即开头说的临时快速的处理) 2:在dto中添加无参构造,改变程序执行流程.