今天在使用mybatis的时候,遇到了下面这个问题:
Caused by: org.springframework.dao.TransientDataAccessResourceException: Error attempting to get column 'sys_created_by' from result set. Cause: java.sql.SQLException: Invalid value for getInt() - '4fa367ec7a29c9312e5fa892b5f9e037'
; Invalid value for getInt() - '4fa367ec7a29c9312e5fa892b5f9e037'; nested exception is java.sql.SQLException: Invalid value for getInt() - '4fa367ec7a29c9312e5fa892b5f9e037'
问题是说sys_created_by本来是int类型,但是却查出了string类型,类型不匹配,导致报错。
可是我检查了代码,发现该字段确实是string类型,那为什么会说int类型转换失败呢?
通过debug,我发现实体类是有构造函数的,而且是包含所有字段的构造函数,mybatis利用这个构造函数创建实例的时候,参数的顺序就是SQL语句选择字段的顺序,不会根据映射关系去选择,所以就出现了类型不匹配。
通过查看代码,我发现实体类有@Builder注解,这个注解产生了全量字段的构造函数,此时,再加上无参构造函数就行了——@NoArgsConstructor。