在Springboot中使用sql进行查询时,报了一个索引越界异常
Error querying database. Cause: java.lang.IndexOutOfBoundsException: Index 8 out of bounds for length 8
### The error may exist in file [D:\exam\paged_query\target\classes\mapper\exam\ZhrjAlarmInfoMapper.xml]
### The error may involve com.zhrj.exam.mapper.ZhrjAlarmInfoMapper.query
### The error occurred while handling results
### SQL: select zi.id, zi.dept_id, zi.wan_ip, zi.event_time, zi.event_type, zi.event_status, zi.event_reasons, zd.dept_name from db50.zhrj_alarm_info zi join db50.zhrj_dept zd on zi.dept_id = zd.dept_id LIMIT ?
### Cause: java.lang.IndexOutOfBoundsException: Index 8 out of bounds for length 8] with root cause
java.lang.IndexOutOfBoundsException: Index 8 out of bounds for length 8
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) ~[na:na]
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) ~[na:na]
at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266) ~[na:na]
at java.base/java.util.Objects.checkIndex(Objects.java:359) ~[na:na]
at java.base/java.util.ArrayList.get(ArrayList.java:427) ~[na:na]
at
查看配置文件,发现写的并没有问题
<resultMap id="ZhrjAlarmInfoResult" type="com.zhrj.exam.entity.ZhrjAlarmInfo">
<result column="id" property="id"></result>
<result column="dept_id" property="deptId"></result>
<result column="wan_ip" property="wanIp"></result>
<result column="event_time" property="eventTime"></result>
<result column="event_type" property="eventType"></result>
<result column="event_status" property="eventStatus"></result>
<result column="event_reasons" property="eventReasons"></result>
</resultMap>
<select id="query" resultMap="ZhrjAlarmInfoResult">
select
zi.id,
zi.dept_id,
zi.wan_ip,
zi.event_time,
zi.event_type,
zi.event_status,
zi.event_reasons,
zd.dept_name
from db50.zhrj_alarm_info zi
join db50.zhrj_dept zd on zi.dept_id = zd.dept_id
<where>
<if test="eventStatus != null">
and event_status = #{eventStatus}
</if>
<if test="eventType != null">
and event_type = #{eventType}
</if>
<if test="eventReasons != null and eventReasons !=null">
and event_reasons like concat('%',#{eventReasons},'%')
</if>
</where>
</select>
查看实现类也没有发现问题
@Override
public PageQueryVo<ZhrjAlarmInfo> query(PageQueryDto pageQueryDto) {
ZhrjAlarmInfo zhrjAlarmInfo = ZhrjAlarmInfo.builder().build();
BeanUtils.copyProperties(pageQueryDto,zhrjAlarmInfo);
Integer pageSize = pageQueryDto.getPageSize();
Integer pageIndex = pageQueryDto.getPageIndex();
log.info("{}",zhrjAlarmInfo);
if(pageSize == 0 || pageIndex ==0){
throw new ParameterException("参数异常");
}
PageHelper.startPage(pageIndex,pageSize);
Page<ZhrjAlarmInfo> zhrjAlarmInfos = zhrjAlarmInfoMapper.query(zhrjAlarmInfo);
Integer total = Math.toIntExact(zhrjAlarmInfos.getTotal());
List<ZhrjAlarmInfo> result = zhrjAlarmInfos.getResult();
return new PageQueryVo<>(total,result,"查找成功");
}
通过debug看,发现每次有运行到mapper查询的时候就出现了问题,既然sql没有问题,那么一定是传入的参数zhrjAlarmInfo有问题
查看实体类,发现使用了@Builder注解但没有加构造方法,加上了空参和有参构造之后就恢复了正常@AllArgsConstructor @NoArgsConstructor,两个都要加,不能少
@Data
@Builder
@JsonIgnoreProperties(ignoreUnknown = true)
public class ZhrjAlarmInfo implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
// 部门ID
private Long deptId;
// 终端IP
private String wanIp;
// 采集时间
private String eventTime;
// 事件类型(DICT: event_type)
private Integer eventType;
// 事件状态(DICT: event_status)
private Integer eventStatus;
// 事件归集原因
private String eventReasons;
//部门得名字
private String deptName;
//事件类型得中文
private String eventTypeName;
/**
* 事件状态中文
*/
private String eventStatusName;
}
结论:
在使用Lombok的@Builder
注解时,通常需要同时结合@AllArgsConstructor
和@NoArgsConstructor
来确保正常运行。这是因为@Builder
生成的构造函数需要在创建对象时设置属性,而@AllArgsConstructor
提供了带有所有属性的构造函数,而@NoArgsConstructor
提供了无参数构造函数。