I am working on an application that streams ResultSet over a network. I ended up using a CachedRowSetImpl class. But when I connect to an Oracle DB, I get an error like this
Most likely you used getTIMESTAMP()
instead of getTimestamp()
. The methods getTIMESTAMP()
(and getDATE()
are extension in OracleResultSet which return Oracle specific types.
If not then you are not using a JDBC driver, because the returntype of getDate()
is java.sql.Date
and of getTimestamp()
is java.sql.Timestamp
, so it can't be a totally different type as in your question.
I think the problem is your setLastUpdate
is expecting an object of java.sql.Date
type.
Now when you use agent.setLastUpdate(res.getDate(3));
The res.getDate(3)
must be returning an object that your method doesn't expect so your there may be ClassCastException
for that.
Try this code and see whether it solves your problem or not:
agent.setLastUpdate(new java.util.Date(res.getDate(3).getTime()));
Add this this line to the JVM setting. It will work.
-Doracle.jdbc.J2EE13Compliant=true
The javadoc for ResultSet.getObject() mandates that the JDBC type should be mapped to a Java type as prescribed by the JDBC spec (TIMESTAMP -> java.sqlTimestmp):
This method will return the value of the given column as a Java object. The type of the Java object will be the default Java object type corresponding to the column's SQL type, following the mapping for built-in types specified in the JDBC specification.
As you have noticed, the Oracle driver is by default not compliant with the standard and uses oracle.sql.TIMESTAMP
instead (which does not extend java.sql.Timestamp
). The good news is that you can force JDBC compliance by setting the oracle.jdbc.J2EE13Compliant system property to true
during vm startup:
java -Doracle.jdbc.J2EE13Compliant=true YourApplication
or programmatically
System.getProperties().setProperty("oracle.jdbc.J2EE13Compliant", "true")
Once you do this, getResult() will return instances of java.sql.Timestamp
, as expected.
For more details see the relevant section from the Oracle JDBC Driver Documentation, which describes several ways of setting oracle.jdbc.J2EE13Compliant.
I found a way out.
oracle.sql.TIMESTAMP ts = (oracle.sql.TIMESTAMP) res.getObject("last_update");
agent.setLastUpdate(new Date(ts.dateValue().getTime()));
This is because oracle.sql.TIMESTAMP is not derived from java.sql.TIMESTAMP
:
java.lang.Object -> oracle.sql.Datum -> oracle.sql.TIMESTAMP
You can't cast the former into the later.
Instead use oracle.sql.TIMESTAMP.timestampValue():
public Timestamp timestampValue(Calendar cal) throws SQLException
Calls
toTimestamp
to convert internal OracleDate
and Calendar to a JavaTimestamp
.