原因:java.lang.ClassCastException:java.sql.Timestamp无法转换为java.sql.Date

原因:java.lang.ClassCastException:java.sql.Timestamp无法转换为java.sql.Date,java,classcastexception,cachedrowset,Java,Classcastexception,Cachedrowset,我得到以下代码段的给定错误: try { cRows = new CachedRowSetImpl(); while(cRows.next()) { MyClass myClass = new MyClass(); myClass.setPrevDate(cRows.getDate("PREV_DATE")); // In debug mode, the error was throwing when I pr

我得到以下代码段的给定错误:

  try {
        cRows = new CachedRowSetImpl();
        while(cRows.next()) 
        {
        MyClass myClass = new MyClass();
        myClass.setPrevDate(cRows.getDate("PREV_DATE")); // In debug mode, the error was throwing when I press Resume from here.
        }
      }
错误:

Caused by: java.lang.ClassCastException: java.sql.Timestamp cannot be cast to java.sql.Date
在数据库中,列的数据类型仅为
DATE
。我无法确定时间戳的位置。

过时:

Caused by: java.lang.ClassCastException: java.sql.Timestamp cannot be cast to java.sql.Date
对字段使用
java.util.Date
java.sql.Timestamp
是它的一个直接子类。正如
java.sql.Date
——它剥离了时间部分。为什么java数据库驱动程序将日期作为时间戳有点奇怪。什么是数据库供应商?你指定了一个长度吗?是否只存储日期


研究:

Caused by: java.lang.ClassCastException: java.sql.Timestamp cannot be cast to java.sql.Date
我查看了一下,Oracle的文档和Oracle做得很好(java.sql.Date、java.sql.Time、java.sql.Timestamp)。 CachedRowSetImpl只是将日期的对象(getObject很可能返回高分辨率的时间戳-随时间变化)强制转换为java.sql.DATE,这是错误的。 所以重写或替换这个sun的类

      /*
       * The object coming back from the db could be
       * a date, a timestamp, or a char field variety.
       * If it's a date type return it, a timestamp
       * we turn into a long and then into a date,
       * char strings we try to parse. Yuck.
       */
       switch (RowSetMD.getColumnType(columnIndex)) {
           case java.sql.Types.DATE: {
               long sec = ((java.sql.Date)value).getTime();
               return new java.sql.Date(sec);
       }

我对这个问题进行了研究,发现了一些有用的链接。我发现日期和时间戳之间的混淆是JDBC驱动程序特有的。大多数链接建议使用
-Doracle.jdbc.V8Compatible=true
。对于我的JBoss,我在
run.bat
中设置了这一点,问题得到了解决

  • oracle文档共享不同的解决方案:

    • 更改表以使用时间戳而不是日期。这可能是 几乎不可能,但如果是这样的话,这是最好的解决方案

    • 更改应用程序以使用defineColumnType定义列 作为时间戳而不是日期。这是有问题的,因为 您确实不想使用defineColumnType,除非必须使用(请参见 什么是defineColumnType?我应该在什么时候使用它?)

    • 将应用程序更改为使用getTimestamp而不是getObject。这 在可能的情况下是一个很好的解决方案,但许多应用程序都包含 依赖getObject的泛型代码,因此并不总是可能的

    • 设置V8Compatible连接属性。这告诉JDBC驱动程序 使用旧映射而不是新映射。您可以设置此标志 作为连接属性或系统属性。你设定了 通过将连接属性添加到java.util.Properties对象 传递给DriverManager.getConnection或 OracleDataSource.setConnectionProperties。您可以设置系统属性 通过在java命令行中包含a-D选项

      java-Doracle.jdbc.V8Compatible=“true”MyApp


    这里是链接:

    给我你的全部课程,然后我可以帮助你我们需要查看CachedRowSetImpl和MyClass代码。这有帮助吗
    http://stackoverflow.com/questions/20130129/error-java-sql-timestamp-cannot-be-cast-to-java-sql-date-in-jfreechart
    @BrunoFranco:
    CachedRowSetImpl
    来自
    导入com.sun.rowset.CachedRowSetImpl@Abhi:这对我不起作用。我的列的值是
    18-09-14
    ,在type.DB中是
    Oracle 11g
    。除此之外,字符串,双等正在使用,这是罚款。让我检查一下。因此,即使列类型为
    DATE
    (根据注释行),我们也不能期望从db列返回
    DATE
    对象。如果我将
    new java.util.DATE()
    替换为
    cRows.getDate(“PREV\u DATE”)
    错误已经消失。因此,我们可以确认返回的对象不是
    DATE
    。。。对吗?如果调用
    ResultSet.getDate(“PREV_DATE”)
    fine,
    Timestamp ts=rs.getTimestamp(“PREV_DATE”)
    应该是可能的,我猜
    rs.getObject(“PREV_DATE”)
    会产生一个时间戳。罪魁祸首是CachedRowImpl。您可以覆盖CachedRowImpl中的
    getDate
    ,并将其转换为java.util.Date。