踩坑笔记:Lombok的Builder注解和Data注解撞上MyBatis导致索引越界
本例中的目标类型是UserEntity
类,在 UserEntity
中我们没有写任何构造函数和get/set
方法,而是由Lombok的Data注解和Builder注解来实现。
Data注解会给被注解的类的所有属性生成get/set
方法以及实现了 hashCode()
、toString()
和 equals()
方法,并且生成一个无参数的构造函数。Builder注解除了会生成相应的建筑者模式的代码外,还会生成一个全属性参数的构造函数,参数的顺序就是属性定义的顺序。
@Data
@Builder
public class User implements Serializable {
private Integer id;
private String username;
private String password;
private String phone;
private Date birthday;
private Date createTime;
private Date updateTime;
private Integer createBy;
private Integer updateBy;
private List<Order> orderList;
}
但是如果Data注解和Builder注解一块使用的话就只会生成全属性参数构造函数,不会有默认无参构造函数。如果您的实体类没有提供无参构造函数,MyBatis 在映射查询结果到实体类时可能会遇到问题,因为默认情况下,MyBatis 会尝试使用无参构造函数实例化对象。
由于实体类TestEntity
同时使用了Data
注解和Builder
注解导致没有默认无参构造函数,只有一个全属性参数构造函数,参数顺序就是属性定义的顺序。MyBatis在把数据库字段映射到实体类的时候发现实体类没有默认无参构造函数的话,就会把数据库中的字段按照构造函数参数的顺序依次赋值给实体类的属性。一旦实体类的属性定义顺序与数据库中字段顺序不一致的话且类型没法兼容(即不能互相转换)就会出错。
解法
给实体类加无参构构造器注解即可
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
private Integer id;
private String username;
private String password;
private String phone;
private Date birthday;
private Date createTime;
private Date updateTime;
private Integer createBy;
private Integer updateBy;
private List<Order> orderList;
}
评论区