java.sql.SQLException: Fail to convert to internal representation

Neal_Shan發表於2020-10-10
message: "Error attempting to get column 'PARAM_NAME' from result set. 
Cause: java.sql.SQLException: Fail to convert to internal representation↵; 
uncategorized SQLException; SQL state [99999]; error code [17059];
 Fail to convert to internal representation; 
nested exception is java.sql.SQLException: 
Fail to convert to internal representation"

 

Java

package com.app.dto;



public class DiversityCustomAttrDTO {

    private Long numberValue;

    private String paramName;



    public DiversityCustomAttrDTO(Long numberValue, String paramName) {

       this.numberValue = numberValue;

       this.paramName = paramName;

    }



// getters setters

}

 

MyBatis

<resultMap id="customAttrResultMap" type="com.app.dto.DiversityCustomAttrDTO">

    <result property="paramName" column="PARAM_NAME" jdbcType="VARCHAR"/>

    <result property="numberValue" column="NUMBER_VALUE" jdbcType="NUMERIC" />

</resultMap>

 

怎麼看都沒問題,刪掉程式碼一行行加回來,原來是IDEA自動生成建構函式的引數順序和resultset裡result順序不匹配時就會報錯。

刪掉建構函式 - 工作

加上預設無參的建構函式 - 工作

調整引數順序和resultset裡一樣 - 工作

 

那麼基本可以推測,mybatis ibatis 原始碼裡當遇到有建構函式的時候,而且有沒有無參的建構函式,引數順序就必須和resultset裡是一致的。

推測底層是通過反射來例項化的,看下反射類中的Constructor,只能拿到

private Class<?>[] parameterTypes;

所以當我們的建構函式第一個是long,而result裡是varchar,也就是String時,就報錯了。

 

相關文章