java.lang.ClassCastException:oracle.sql.TIMESTAMP不能转换为java.sql.TIMESTAMP

java.lang.ClassCastException:oracle.sql.TIMESTAMP不能转换为java.sql.TIMESTAMP,oracle,jdbc,Oracle,Jdbc,我正在开发一个通过网络传输结果集的应用程序。我最终使用了CachedRowSetImpl类。但是,当我连接到Oracle数据库时,会出现如下错误 java.lang.ClassCastException:oracle.sql.TIMESTAMP不能转换为java.sql.TIMESTAMP 请帮忙 源代码如下: ResultSet res = response.getResultSet(); //resultset from the server while (res.next()) {

我正在开发一个通过网络传输结果集的应用程序。我最终使用了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不能转换为java.sql.TIMESTAMP 位于com.sun.rowset.CachedRowSetImpl.getDate(CachedRowSetImpl.java:2139)


我认为问题在于您的
setLastUpdate
需要一个
java.sql.Date
类型的对象

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

res.getDate(3)
必须返回一个方法不期望的对象,因此可能存在
ClassCastException

尝试此代码,看看它是否解决了您的问题:

agent.setLastUpdate(new java.util.Date(res.getDate(3).getTime()));
这是因为它不是从
java.sql.TIMESTAMP
派生的:

你不能把前者变成后者

而是使用:

调用
toTimestamp
将内部Oracle
日期和日历转换为Java
时间戳

我找到了一条出路

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

您很可能使用了
getTIMESTAMP()
而不是
getTIMESTAMP()
。方法
getTIMESTAMP()
(和
getDATE()
是返回Oracle特定类型的扩展

如果不是,那么您就不使用JDBC驱动程序,因为
getDate()
的返回类型是
java.sql.Date
getTimestamp()的返回类型
java.sql.Timestamp
,因此它不能像您的问题中那样是完全不同的类型。

javadoc for要求JDBC类型应映射到JDBC规范(Timestamp->java.sqlTimestmp)规定的java类型:

此方法将以Java语言返回给定列的值 Java对象的类型将是默认的Java对象 与列的SQL类型对应的类型,遵循 JDBC规范中指定的内置类型

正如您所注意到的,Oracle驱动程序默认不符合标准,而是使用
Oracle.sql.TIMESTAMP
(它不扩展
java.sql.TIMESTAMP
)。好消息是,您可以通过在vm启动期间将oracle.JDBC.J2EE13Compliant系统属性设置为
true
来强制遵守JDBC:

java -Doracle.jdbc.J2EE13Compliant=true YourApplication
或以编程方式

System.getProperties().setProperty("oracle.jdbc.J2EE13Compliant", "true")
执行此操作后,getResult()将按预期返回
java.sql.Timestamp
的实例


有关更多详细信息,请参阅中的相关部分,其中介绍了设置oracle.jdbc.J2EE13兼容的几种方法。

这可以通过使用oracle.sql.TIMESTAMP类中的timestampValue()函数来解决。此方法将oracle.sql.TIMESTAMP转换为java.sql.TIMESTAMP

oracle.sql.TIMESTAMP ts=(oracle.sql.TIMESTAMP)res.getObject(“上次更新”);
agent.setLastUpdate(ts.timestampValue());

将这一行添加到JVM设置中。它会工作的

-Doracle.jdbc.J2EE13Compliant=true

发布代码并堆栈tracejava.lang.ClassCastException:oracle.sql.TIMESTAMP不能转换为java.sql.TIMESTAMP java.lang.ClassCastException:oracle.sql.TIMESTAMP不能转换为java.sql.TIMESTAMP,位于com.sun.rowset.CachedRowSetImpl.getDate(CachedRowSetImpl.java:2139)同时发布代码和整个堆栈跟踪,只在问题内部编辑,而不是将其添加到commentResultSet res=response.getResultSet();//来自服务器的结果集,而(res.next()){Agent 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 agent.setAccountNumber(res.getString(5));Vincent的回答解释了引发异常的原因,但这(Bogdan的)答案是原始代码看到的是oracle.sql.Timestamp对象而不是java.sql.Timestamp对象的原因。如果您知道您总是想要J2EE13兼容的属性集,您可以在代码中使用
Properties props=System.getProperties();props.setProperty(“oracle.jdbc.J2EE13兼容”,“true”);
System.getProperties().setProperty("oracle.jdbc.J2EE13Compliant", "true")
-Doracle.jdbc.J2EE13Compliant=true