我正在开发一个通过网络传输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)
答案 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
将内部OracleDate
和日历转换为JavaTimestamp
。
答案 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()
,所以它不能是与你的问题完全不同的类型。