我的工作是通过网络流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)
适用于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的几种方法。
我找到了出路。
oracle.sql.TIMESTAMP ts = (oracle.sql.TIMESTAMP) res.getObject("last_update");
agent.setLastUpdate(new Date(ts.dateValue().getTime()));
这是因为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
。
收藏此此行到JVM设置。 它将工作。
-Doracle.jdbc.J2EE13Compliant=true
这可通过使用存在于oracle.sql.TIMESTAMP类中的时间戳记值()函数来解决。 此方法将oracle.sql.TIMESTAMP转换成的java.sql.Timestamp。
oracle.sql.TIMESTAMP TS =(oracle.sql.TIMESTAMP)res.getObject( “LAST_UPDATE”); agent.setLastUpdate(ts.timestampValue());
我认为这个问题是您setLastUpdate
期待的对象java.sql.Date
类型。
现在,当您使用agent.setLastUpdate(res.getDate(3));
该res.getDate(3)
必须返回一个对象,你的方法并不期望这样你有可能会ClassCastException
了点。
试试这个代码,看看它是否解决您的问题或不:
agent.setLastUpdate(new java.util.Date(res.getDate(3).getTime()));
最有可能你使用getTIMESTAMP()
代替getTimestamp()
方法getTIMESTAMP()
和getDATE()
是扩展在OracleResultSet
其中返回的Oracle特定类型。
如果没有,那么你不使用JDBC驱动程序,因为返回类型getDate()
是java.sql.Date
和getTimestamp()
是java.sql.Timestamp
,所以它不可能是一个完全不同的类型,你的问题。
文章来源: java.lang.ClassCastException: oracle.sql.TIMESTAMP cannot be cast to java.sql.Timestamp