省流:加了@Builder导致报错。
需再加两个注解@NoArgsConstructor,@AllArgsConstructor
问题
报下标越界,持久化异常
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.lang.IndexOutOfBoundsException: Index 3 out of bounds for length 3
分析
先排查sql是否错误。复制打印的sql,可以查询出数据。sql正确。
既然sql可以查到数据,那就只能从mybatis实体映射的角度出发来考虑。
@Data
@Builder
public class Org{
private String id;
private String orgCode;
private String orgName;
private Date createTime;
private Date updateTime;
}
因为这里使用了lombok插件。如果不使用lombok,实体类中只需要有getter和setter方法即可。
那很有可能是lombok导致。
看下编译后的class文件,发现只有一个全参构造,没有无参构造。
mybatis将查询结果映射成实体时是通过无参构造获得一个实例,然后调用setter方法将值存入字段。
解决方法
在实体类增加注解@NoArgsConstructor和@AllArgsConstructor,使编译器编译的时候提供出无参构造。
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
注意:因为使用@Builder注解,所以光添加一个@NoArgsConstructor,程序会编译报错,builder需要一个全参构造,所以还得加上@AllArgsConstructor。