java.lang.ClassCastException:oracle.sql.TIMESTAMP不

2019-07-03 15:24发布

我的工作是通过网络流ResultSet的应用程序。 我结束了使用对CachedRowSetImpl类。 但是,当我连接到Oracle数据库,我得到这样一个错误

java.lang.ClassCastException:oracle.sql.TIMESTAMP不能转换到的java.sql.Timestamp

请帮忙。

源代码如下:

ResultSet res = response.getResultSet(); //resultset from the server
while (res.next()) {
    Agent agent = new Agent();
    agent.setName(res.getString(2));
    agent.setMobile(res.getString(1));
    agent.setBalance(res.getLong(4));
    agent.setLastUpdate(res.getDate(3)); //date from the result set
    agent.setAccountNumber(res.getString(5));
}

错误 ...

java.lang.ClassCastException:oracle.sql.TIMESTAMP不能转换到的java.sql.Timestamp java.lang.ClassCastException:oracle.sql.TIMESTAMP不能com.sun.rowset.CachedRowSetImpl.getDate被转换为的java.sql.Timestamp (CachedRowSetImpl.java:2139)

Answer 1:

适用于Javadoc 的ResultSet.getObject()强制要求由JDBC规范规定的JDBC类型应该被映射到一个Java类型(TIMESTAMP - > java.sqlTimestmp):

此方法将返回给定列的值作为一个Java对象。 该类型的Java对象将是对应于列的SQL类型的默认Java对象类型,下面的映射内置在JDBC规范中指定的类型。

正如您已经注意到,Oracle驱动程序默认情况下与标准不符合 ,并使用oracle.sql.TIMESTAMP代替(不延伸java.sql.Timestamp )。 好消息是,你可以通过设置oracle.jdbc.J2EE13Compliant系统属性,迫使JDBC兼容true虚拟机启动时:

java -Doracle.jdbc.J2EE13Compliant=true YourApplication

或编程

System.getProperties().setProperty("oracle.jdbc.J2EE13Compliant", "true")

一旦你这样做,的getResult()将返回的实例java.sql.Timestamp ,符合市场预期。

欲了解更多详情,请参见从相关部分的Oracle JDBC驱动程序文档 ,它描述了设置oracle.jdbc.J2EE13Compliant的几种方法。



Answer 2:

我找到了出路。

 oracle.sql.TIMESTAMP ts = (oracle.sql.TIMESTAMP) res.getObject("last_update");
 agent.setLastUpdate(new Date(ts.dateValue().getTime()));


Answer 3:

这是因为oracle.sql.TIMESTAMP不是源自java.sql.TIMESTAMP

 java.lang.Object -> oracle.sql.Datum -> oracle.sql.TIMESTAMP 

你不能施放前到更高版本。

而是使用oracle.sql.TIMESTAMP.timestampValue()

 public Timestamp timestampValue(Calendar cal) throws SQLException 

呼吁toTimestamp到Oracle内部转换Date和日历一个Java Timestamp



Answer 4:

收藏此此行到JVM设置。 它将工作。

-Doracle.jdbc.J2EE13Compliant=true


Answer 5:

这可通过使用存在于oracle.sql.TIMESTAMP类中的时间戳记值()函数来解决。 此方法将oracle.sql.TIMESTAMP转换成的java.sql.Timestamp。

oracle.sql.TIMESTAMP TS =(oracle.sql.TIMESTAMP)res.getObject( “LAST_UPDATE”); agent.setLastUpdate(ts.timestampValue());



Answer 6:

我认为这个问题是您setLastUpdate期待的对象java.sql.Date类型。

现在,当您使用agent.setLastUpdate(res.getDate(3));

res.getDate(3)必须返回一个对象,你的方法并不期望这样你有可能会ClassCastException了点。

试试这个代码,看看它是否解决您的问题或不:

agent.setLastUpdate(new java.util.Date(res.getDate(3).getTime()));


Answer 7:

最有可能你使用getTIMESTAMP()代替getTimestamp() 方法getTIMESTAMP()getDATE()是扩展在OracleResultSet其中返回的Oracle特定类型。

如果没有,那么你不使用JDBC驱动程序,因为返回类型getDate()java.sql.DategetTimestamp()java.sql.Timestamp ,所以它不可能是一个完全不同的类型,你的问题。



文章来源: java.lang.ClassCastException: oracle.sql.TIMESTAMP cannot be cast to java.sql.Timestamp
标签: oracle jdbc