25

ネットワーク経由で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をcom.sun.rowset.CachedRowSetImpl.getDateのjava.sql.Timestampにキャストできません(CachedRowSetImpl.java:2139)

4

7 に答える 7

6

私は逃げ道を見つけました。

 oracle.sql.TIMESTAMP ts = (oracle.sql.TIMESTAMP) res.getObject("last_update");
 agent.setLastUpdate(new Date(ts.dateValue().getTime()));
于 2012-11-07T14:50:09.780 に答える
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および Calendar を Javaに変換するための呼び出しTimestamp

于 2012-11-07T13:06:27.270 に答える
0

問題は、タイプsetLastUpdateのオブジェクトを期待していることだと思います。java.sql.Date

今使うときはagent.setLastUpdate(res.getDate(3));

res.getDate(3)メソッドが予期しないオブジェクトを返す必要があるため、そのためのオブジェクトが存在する可能性がありますClassCastException

このコードを試して、問題が解決するかどうかを確認してください。

agent.setLastUpdate(new java.util.Date(res.getDate(3).getTime()));
于 2012-11-07T13:04:39.723 に答える
0

getTIMESTAMP()の代わりに使用した可能性が高いですgetTimestamp()。メソッドgetTIMESTAMP()(および)は、 Oracle 固有の型を返すgetDATE()拡張機能です。OracleResultSet

そうでない場合は、JDBC ドライバーを使用していません。これは、 getDate()isjava.sql.Dateおよび of getTimestamp()isの returntype であるためjava.sql.Timestamp、質問のようにまったく異なる型にすることはできません。

于 2012-11-07T19:45:57.160 に答える