1、拉取一个项目的代码在本地运行,调用接口时报错:
org.springframework.dao.DataIntegrityViolationException: Error attempting to get column 'type' from result set. Cause: java.sql.SQLDataException: Cannot determine value type from string 'org'
; Cannot determine value type from string 'org'; nested exception is java.sql.SQLDataException: Cannot determine value type from string 'org'
at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:84)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:88)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:440)
2、百度一下这个报错,说是实体类属性与数据库字段类型不一致引起的。检查一下实体类中这个报错的属性和数据库字段类型一致的(其他同事的环境都能正常访问接口)。
由于项目中引入了lombok,所以看了一下项目引入的版本号(1.16.22)与本地sts安装的lombok插件版本(很早之前安装的1.16.8)不一致。
3、更改sts的lombok插件版本并反编译进行比较,发现使用lombok 1.16.22反编译后的代码并1.16.8多一个private的无参构造函数(1.16.8只有一个全部属性的构造函数)。sts换成lombok1.16.22后接口调用正常,不再报错。
3.1、实体类:
3.2、使用lombok 1.16.22反编译后的代码
4、lombok 1.16.22比1.16.8多了这个private构造函数的功能??那去实锤一下!
5、没有无参构造函数时,mybatsi为啥报这个错误呢?
5.1、此时只有一个包含全部属性的构造函数,mybatis就会找出这些属性对应的值,并实例化一个实体类对象
5.2、在找属性对应的值时,mybatis会按照实体类全属性的构造函数的入参顺序,与sql的查询结果对应,如果实体类的属性和sql结果列不能匹配时都会报错。
6、报错解决方式
6.1、方式一:保持STS插件lombok版本与项目中的lombok版本一致
6.2、方式二:在实体类中加入下图中的2个lombok注解,使编译后的类有public的无参函数(推荐)
6.2.1、实体类中加入2个lombok注解,声明生成无参构造函数
6.2.2、反编译后的实体类