私はネットワーク経由で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))
ベストアンサー1
JavadocのResultSet.getObject()JDBC 仕様で規定されているように、JDBC 型を Java 型にマップする必要があります (TIMESTAMP -> java.sqlTimestmp)。
このメソッドは、指定された列の値を Java オブジェクトとして返します。Java オブジェクトの型は、JDBC 仕様で指定された組み込み型のマッピングに従って、列の SQL 型に対応するデフォルトの Java オブジェクト型になります。
ご存知のとおり、Oracleドライバはデフォルトで標準に準拠していない代わりにを使用しますoracle.sql.TIMESTAMP
( は を拡張しませんjava.sql.Timestamp
)。良いニュースは、 を設定することでJDBC準拠を強制できることです。oracle.jdbc.J2EE13準拠true
VM 起動時のシステム プロパティ:
java -Doracle.jdbc.J2EE13Compliant=true YourApplication
またはプログラム的に
System.getProperties().setProperty("oracle.jdbc.J2EE13Compliant", "true")
java.sql.Timestamp
これを実行すると、getResult() は期待どおりにのインスタンスを返します。
詳細については、Oracle JDBC ドライバーのドキュメントoracle.jdbc.J2EE13Compliant を設定するいくつかの方法について説明しています。