【问题标题】:java.lang.ClassCastException: oracle.sql.TIMESTAMP cannot be cast to java.sql.Timestampjava.lang.ClassCastException:oracle.sql.TIMESTAMP 无法转换为 java.sql.Timestamp
【发布时间】:2012-10-27 11:59:44
【问题描述】:

我正在开发一个通过网络传输 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 无法转换为 java.sql.Timestamp 在 com.sun.rowset.CachedRowSetImpl.getDate(CachedRowSetImpl.java:2139)

【问题讨论】:

  • 发布您的代码和堆栈跟踪
  • java.lang.ClassCastException: oracle.sql.TIMESTAMP 不能转换为 java.sql.Timestamp java.lang.ClassCastException: oracle.sql.TIMESTAMP 不能转换为 com 的 java.sql.Timestamp .sun.rowset.CachedRowSetImpl.getDate(CachedRowSetImpl.java:2139)
  • 同时发布您的代码和整个堆栈跟踪
  • 也只在你的问题中编辑它,而不是在评论中添加它
  • 结果集 res = response.getResultSet(); //来自服务器的结果集 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)); //日期 agent.setAccountNumber(res.getString(5));

标签: oracle jdbc


【解决方案1】:

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

-Doracle.jdbc.J2EE13Compliant=true

【讨论】:

    【解决方案2】:

    这是因为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 和 Calendar 转换为 Java Timestamp

    【讨论】:

      【解决方案3】:

      这可以通过使用 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());

      【讨论】:

        【解决方案4】:

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

        此方法会将给定列的值作为 Java 返回 目的。 Java 对象的类型将是默认的 Java 对象 type 对应于列的 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 的几种方法。

        【讨论】:

        • Vincent 的回答解释了引发异常的原因,但这个(Bogdan 的)回答是原始代码看到 oracle.sql.Timestamp 对象而不是 java.sql.Timestamp 对象的原因。如果你知道你总是想要 J2EE13Compliant 属性集,你可以在代码中使用Properties props = System.getProperties(); props.setProperty("oracle.jdbc.J2EE13Compliant", "true") ;
        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          我找到了一条出路。

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

          【讨论】:

            【解决方案7】:

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

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

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-02-23
              • 1970-01-01
              • 2013-01-27
              • 2012-09-12
              • 1970-01-01
              • 2020-03-26
              • 2012-06-27
              • 2013-09-28
              相关资源
              最近更新 更多