Skip to content

Instantly share code, notes, and snippets.

@sagnitude
Created June 6, 2024 08:09
Show Gist options
  • Save sagnitude/d5502169eb207e8df1faf31f57d70a14 to your computer and use it in GitHub Desktop.
Save sagnitude/d5502169eb207e8df1faf31f57d70a14 to your computer and use it in GitHub Desktop.
Kingbase-V8R6-LocalDateTime-convert-error

人大金仓数据库 V8R6,使用 MybatisPlus 连接时,类型为 LocalDateTime 的字段解析失败,报错如下:

Caused by: com.kingbase8.util.KSQLException: Cannot convert the column of type <unknown:7954> to requested type timestamp.
	at com.kingbase8.jdbc.KbResultSet.getLocalDateTime(KbResultSet.java:739)
	at com.kingbase8.jdbc.KbResultSet.getObject(KbResultSet.java:3623)
	at com.kingbase8.jdbc.KbResultSet.getObject(KbResultSet.java:3665)
	at com.alibaba.druid.filter.FilterChainImpl.resultSet_getObject(FilterChainImpl.java:1431)
	at com.alibaba.druid.filter.stat.StatFilter.resultSet_getObject(StatFilter.java:846)
	at com.alibaba.druid.filter.FilterChainImpl.resultSet_getObject(FilterChainImpl.java:1427)
	at com.alibaba.druid.proxy.jdbc.ResultSetProxyImpl.getObject(ResultSetProxyImpl.java:1561)
	at com.alibaba.druid.pool.DruidPooledResultSet.getObject(DruidPooledResultSet.java:1777)
	at org.apache.ibatis.type.LocalDateTimeTypeHandler.getNullableResult(LocalDateTimeTypeHandler.java:38)
	at org.apache.ibatis.type.LocalDateTimeTypeHandler.getNullableResult(LocalDateTimeTypeHandler.java:28)
	at org.apache.ibatis.type.BaseTypeHandler.getResult(BaseTypeHandler.java:85)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getPropertyMappingValue(DefaultResultSetHandler.java:518)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.applyPropertyMappings(DefaultResultSetHandler.java:487)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getRowValue(DefaultResultSetHandler.java:411)


原因:JdbcType 到 JavaType 的解析有问题 Central Maven 上发布的版本 cn.com.kingbase8:kingbase8:8.6.0 不是最新版本,到官网下载最新的 JDBC 驱动包

https://www.kingbase.com.cn/xzzx/index.htm

直接原因:

KbResultSet.java 负责执行字段转换,老版本这个地方的代码是

if (oid != 1114 && oid != 1184) {
    KSQLException ksqlException = new KSQLException(GT.tr("Cannot convert the _column of type {0} to requested type {1}.", new Object[]{Oid.toString(oid), "timestamp"}), KSQLState.DATA_TYPE_MISMATCH);
    throw ksqlException;
}

新版本增加了 oid=7954 的支持:


    private LocalDateTime getLocalDateTime(int i) throws SQLException {
        TraceLogger.logLineInfo(Level.ALL, "lineInfo");
        this.checkResultSet_(i);
        if (this.wasNullFlagT) {
            TraceLogger.logLineInfo(Level.ALL, "lineInfo");
            return null;
        } else {
            int _col = i - 1;
            int oid = this.fieldsT[_col].getOID();
            if (oid != 1114 && oid != 1184 && oid != 7952 && oid != 7954) {
                TraceLogger.logLineInfo(Level.ALL, "lineInfo");
                KSQLException ksqlException = new KSQLException(GT.tr("Cannot convert the _column of type {0} to requested type {1}.", new Object[]{Oid.toString(oid), "timestamp"}), KSQLState.DATA_TYPE_MISMATCH);
                throw ksqlException;
            } else if (this.isBinary_(i)) {
                TraceLogger.logLineInfo(Level.ALL, "lineInfo");
                return this.baseConnection.getTimestampUtils().toLocalDateTimeBin(this._thisRow[_col]);
            } else {
                TraceLogger.logLineInfo(Level.ALL, "lineInfo");
                String str = this.getString(i);
                LocalDateTime localDateTime = this.baseConnection.getTimestampUtils().toLocalDateTime(str);
                return localDateTime;
            }
        }
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment