引起:java.lang.ClassCastException:java.sql.Timestamp无法强制转换为java.sql.Date

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

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 。 我无法弄清楚Timestamp在这里的位置。

过时:

java.util.Date用于该字段。 java.sql.Timestamp是它的直接子类。 与java.sql.Date – 剥离时间部分。 为什么java数据库驱动程序将DATE设为Timestamp有点奇怪。 什么是数据库供应商? 你指定了一个长度吗? 确实只存储日期?


研究:

我查看了CachedRowSetImpl.java ,Oracle的文档和Oracle做的一切都很好(java.sql.Date,java.sql.Time,java.sql.Timestamp convertible)。 CachedRowSetImpl只是简单地转换DATE的Object(并且getObject可能会将高分辨率时间戳 – 随时间返回)返回java.sql.Date,这是错误的。 所以重写替代这个太阳的阶级。

  /* * 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); } 

我已就此问题进行了研究,并找到了一些有用的链接。 我发现DATE和TIMESTAMP之间的这种混淆是特定于JDBC驱动程序的。 大多数链接建议使用-Doracle.jdbc.V8Compatible=true 。 对于我的JBoss,我在run.bat设置了这个问题并解决了问题。

  1. https://community.oracle.com/thread/68918?start=0&tstart=0

  2. http://www.coderanch.com/t/90891/JBoss/oracle-jdbc-Compatible-true

  3. https://community.oracle.com/message/3613155

oracle doc分享不同的解决方案:

  • 更改表以使用TIMESTAMP而不是DATE。 这可能很少可能,但它是最好的解决方案。

  • 更改应用程序以使用defineColumnType将列定义为TIMESTAMP而不是DATE。 这有问题因为你真的不想使用defineColumnType,除非你必须(参见什么是defineColumnType以及我何时应该使用它?)。

  • 改变应用程序使用getTimestamp而不是getObject。 这是一个很好的解决方案,但是许多应用程序包含依赖于getObject的通用代码,因此并不总是可行。

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

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

这是链接: http : //www.oracle.com/technetwork/database/enterprise-edition/jdbc-faq-090281.html#08_00