今天遇到了这个异常
java.sql.SQLException: Fail to convert to internal representation
at oracle.jdbc.driver.CharCommonAccessor.getLong(CharCommonAccessor.java:297)
at oracle.jdbc.driver.T4CVarcharAccessor.getLong(T4CVarcharAccessor.java:849)
at oracle.jdbc.driver.OracleResultSetImpl.getLong(OracleResultSetImpl.java:939)
at oracle.jdbc.driver.OracleResultSet.getLong(OracleResultSet.java:440)
at com.alibaba.druid.pool.DruidPooledResultSet.getLong(DruidPooledResultSet.java:304)
at cn.egame.data.core.rowmapper.js.OpenChannelSettlementsRowMapper.mapRow(OpenChannelSettlementsRowMapper.java:21)
at cn.egame.data.core.rowmapper.js.OpenChannelSettlementsRowMapper.mapRow(OpenChannelSettlementsRowMapper.java:14)
java代码
bean.setDistributorId(rs.getLong("distributor_id"));
这里数据库中distributor_id为varchar2,用getLong去出来
此问题非必现,查看数据也没问题
来查看下各个类的源码(反编译的,此包非开源)
OracleResultSetImpl
public synchronized long getLong(int var1) throws SQLException {
if(var1 <= 0 || var1 > this.statement.numberOfDefinePositions) {
DatabaseError.throwSqlException(3);
}
if(this.closed) {
DatabaseError.throwSqlException(11);
}
int var2 = this.statement.currentRow;
if(var2 < 0) {
DatabaseError.throwSqlException(14);
}
this.statement.lastIndex = var1;
if(this.statement.streamList != null) {
this.statement.closeUsedStreams(var1);
}
//T4CVarcharAccessor.getLong
return this.statement.accessors[var1 - 1].getLong(var2);
}
几个类的关系如下
T4CVarcharAccessor extends VarcharAccessor extends CharCommonAccessor
如下是CharCommonAccessor.getLong方法
long getLong(int var1) throws SQLException {
long var2 = 0L;
if(this.rowSpaceIndicator == null) {
DatabaseError.throwSqlException(21);
}
if(this.rowSpaceIndicator[this.indicatorIndex + var1] != -1) {
try {
var2 = Long.parseLong(this.getString(var1).trim());
} catch (NumberFormatException var5) {
DatabaseError.throwSqlException(59);
}
}
return var2;
}
反编译代码如下
/* */ long getLong(int paramInt)
/* */ throws SQLException
/* */ {
/* 273 */ long l = 0L;
/* */
/* 275 */ if (this.rowSpaceIndicator == null)
/* */ {
/* 279 */ SQLException localSQLException1 = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 21);
/* 280 */ localSQLException1.fillInStackTrace();
/* 281 */ throw localSQLException1;
/* */ }
/* */
/* 287 */ if (this.rowSpaceIndicator[(this.indicatorIndex + paramInt)] != -1)
/* */ {
/* */ try
/* */ {
/* 291 */ l = Long.parseLong(getString(paramInt).trim());
/* */ }
/* */ catch (NumberFormatException localNumberFormatException)
/* */ {
/* 296 */ SQLException localSQLException2 = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 59);
/* 297 */ localSQLException2.fillInStackTrace();
/* 298 */ throw localSQLException2;
/* */ }
/* */
/* */ }
报错在297行,也就是
“java.sql.SQLException: Fail to convert to internal representation”
从291行看,网上搜到很多方法说将getLong变为getString,在数据为数字的情况下,个人觉得没有实际意义