人大金仓数据库 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;
}
}
}