lombok同时使用@Builder和@Data报错
mybatisPlus版本3.2.0
lombok版本 1.18.10
问题复现:同时使用@Builder和@Data
@Builder
@Data
实体类
@Builder
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("COLUMNS")
public class Column {
/**
* TABLE_CATALOG 表限定符
* MySQL官方文档中说,这个字段值永远是def,但没写这个字段是干嘛用的。
*/
@MdTableInfo(name = "表限定符")
private String tableCatalog;
/**
* TABLE_SCHEMA 表所有者,就是属于哪个库
*/
@MdTableInfo(name = "数据库名称")
private String tableSchema;
/**
* TABLE_NAME 表名
*/
@MdTableInfo(name = "表名")
private String tableName;
/**
* COLUMN_NAME 列名
*/
@MdTableInfo(name = "字段名")
private String columnName;
/**
* ORDINAL_POSITION 应该是该列在该表中的顺序
*/
@MdTableInfo(name = "字段序号")
private Long ordinalPosition;
}
测试
@Test
void test3() throws IOException {
List<Column> columns = columnMapper.selectList(null);
System.out.println(columns);
}
报错信息
org.springframework.dao.DataIntegrityViolationException: Error attempting to get column 'data_type' from result set. Cause: java.sql.SQLDataException: Cannot determine value type from string 'varchar'
; Cannot determine value type from string 'varchar'; nested exception is java.sql.SQLDataException: Cannot determine value type from string 'varchar'
原因分析,在同时使用@Builder和@Data的时候实体类只有一个全参构造,mybatis在拿到结果resultSet之后进行映射使用全参构造,但是查询的sql却和字段的顺序不一致,全参构造和字段顺序不一致(说明1)这样会导致参数类型匹配错误,导致报错。
解决办法:
-
两个用一个就行 ,个人感觉实体类用builder模式不好
-
加上无参构造,并且在无参构造之上加上注解 @Tolerate ,不加的话编辑器不通过
-
降低版本,亲测1.16.22版本可以用(说明2)
说明1:jdk自带的反射明确说明反射获取字段的顺序不保证是按照代码编写的顺序,但是本人多次测试,jdk8和jdk11通过反射可以正确的获取反射的字段顺序,mybatisPlus拼接的sql代码我还没看,但是其结果和字段顺序不一致,特别说明,反射获取的方法顺序是乱的
说明2:lombok版本1.16.22可以用的原因在于,通过javap查看class文件发现其中有了两个init方法,表名其有两个构造函数,一个是private的无参,这时就算编辑器不通过,你还是可以在本类里面进行new的
本文为作者原创,转载请申明