记一次@Builder引发的Bug

问题描述:

使用MybatisPlus的selectOne方法搜索一个User类时报错

1
2
3
4
5
6
7
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database. Cause: java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
### The error may exist in com/qgStudio/pedestal/mapper/UserMapper.java (best guess)
### The error may involve com.qgStudio.pedestal.mapper.UserMapper.selectOne
### The error occurred while handling results
### SQL: SELECT default_reminder_interval FROM user
### Cause: java.lang.IndexOutOfBoundsException: Index: 1, Size: 1

报错代码

1
User user = userMapper.selectOne(new LambdaQueryWrapper().select(User::getDefaultReminderInterval));

问题分析

根据报错信息,出错的原因是因为数组越界,推测会不会是因为搜索出来两个对象报错,但是改用selectList方法还是报错,推测是在创建User对象的过程中报的错,后来发现添加了@Builder后会自动为对象创建一个全参的构造器,而且没有主动为User类创建一个无参构造器,导致在创建User对象的时候,只能使用全参构造器,这是需要全部的属性才能创建对象,但是sql语句只查询了一列,导致在获取其他参数的时候越界

总结

这次的报错主要是没有理解好@Builder注解的作用,不知道会自动生成一个全参构造器,并且没有养成好的习惯手动为对象创建一个无参构造器导致出问题,后续要养成好的编程习惯

image-20240501111319589