java.lang.ClassCastException:oracle.sql.TIMESTAMP无法强制转换为java.sql.Timestamp

时间:2012-11-07 12:12:59

标签: oracle jdbc

我正在开发一个通过网络传输ResultSet的应用程序。我最终使用了CachedRowSetImpl类。但是当我连接到Oracle DB时,我收到类似这样的错误

  

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)

7 个答案:

答案 0 :(得分:28)

ResultSet.getObject()的javadoc要求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 Driver Documentation中的相关部分,其中介绍了设置oracle.jdbc.J2EE13Compliant的几种方法。

答案 1 :(得分:5)

我找到了出路。

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

答案 2 :(得分: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

答案 3 :(得分:3)

将此行添加到JVM设置。它将起作用。

-Doracle.jdbc.J2EE13Compliant=true

答案 4 :(得分:1)

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

oracle.sql.TIMESTAMP ts =(oracle.sql.TIMESTAMP)res.getObject(" last_update");  agent.setLastUpdate(ts.timestampValue());

答案 5 :(得分:0)

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

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

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

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

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

答案 6 :(得分:0)

您很可能使用getTIMESTAMP()代替getTimestamp()。方法getTIMESTAMP()(和getDATE()OracleResultSet中的扩展,它返回Oracle特定类型。

如果没有,那么你没有使用JDBC驱动程序,因为getDate()的{​​{1}}和java.sql.Date的返回类型是getTimestamp(),所以它不能是与你的问题完全不同的类型。