25

我正在开发一个通过网络传输 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)

4

7 回答 7

35

ResultSet.getObject()的 javadoc要求 JDBC 类型应映射到 JDBC 规范规定的 Java 类型(TIMESTAMP -> java.sqlTimestmp):

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

正如您所注意到的,Oracle 驱动程序默认情况下不符合标准oracle.sql.TIMESTAMP而是使用(不扩展java.sql.Timestamp)。好消息是,您可以通过在 vm 启动期间将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 的几种方法。

于 2014-02-26T22:48:23.767 回答
6

我找到了出路。

 oracle.sql.TIMESTAMP ts = (oracle.sql.TIMESTAMP) res.getObject("last_update");
 agent.setLastUpdate(new Date(ts.dateValue().getTime()));
于 2012-11-07T14:50:09.780 回答
5

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

-Doracle.jdbc.J2EE13Compliant=true
于 2018-06-27T07:11:37.123 回答
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将内部 OracleDate和 Calendar 转换为 Java 的调用Timestamp

于 2012-11-07T13:06:27.270 回答
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());

于 2017-09-19T06:58:30.160 回答
0

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

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

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

试试这段代码,看看它是否能解决你的问题:

agent.setLastUpdate(new java.util.Date(res.getDate(3).getTime()));
于 2012-11-07T13:04:39.723 回答
0

您很可能使用getTIMESTAMP()getTimestamp(). 方法getTIMESTAMP()(并且getDATE()OracleResultSet返回 Oracle 特定类型的扩展。

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

于 2012-11-07T19:45:57.160 回答