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、反編譯后的實體類