java.lang.ClassCastException:oracle.sql.TIMESTAMP不能转换为java.sql.TIMESTAMP
我正在开发一个通过网络传输结果集的应用程序。我最终使用了CachedRowSetImpl类。但是,当我连接到Oracle数据库时,会出现如下错误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()) {
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