8

状況は次のようなものです。

PostgreSQL データベース テーブルには次のフィールドdateAddedがあります。timestamp

Pojo Model オブジェクトは、このフィールドを次のようにマップします。

class MyModel{
   org.joda.time.DateTime dateAdded;

}

私の Dao 実装は Spring JDBC テンプレートにあり、次のようになります。

SqlParameterSource parameters = new BeanPropertySqlParameterSource(patient);
jdbcInsert.execute(parameters);

クライアントからモデルを読み取り、 を使用してオブジェクトを構築します@Model。これまでのところ、すべて問題ありません。これを実行すると、データベースは次のような例外をスローします。
[Erwin の編集]: データベースから例外が発生していないことが判明しました。

org.postgresql.util.PSQLException: Bad value for type timestamp : 2011-10-10T21:55:19.790+03:00

多くのフィールドが含まれているため、完全な INSERT ステートメントを実装して手動で書式設定を行いたくありません。

ここで可能な最善の解決策は何ですか? toString()すべてのDateTime通話を構成する方法はありますか。DateTime から継承したクラスを作成することも考えましたが ... うーん、それは最終的なものです。

--

編集

Erwin によると、DateTime 値 '2011-10-10T21:55:19.790+03:00' をダミー テーブルに挿入してテストしたところ、機能しています。しかし、JDBC を扱うことはできません。JDBC ドライバーに関連するものはありますか?

4

1 に答える 1

17

ここでの問題はJdbcTemplate、準備されたステートメントを使用してから値をバインドすることです。問題のフィールドはタイムスタンプ型であるため、.として設定する必要がありますjava.sql.Date。この場合、Spring は Joda TimeインスタンスsetObjectを渡してジェネリック メソッドを呼び出しています。DateTimeドライバーはこれを に変換する方法を認識していないjava.sql.Dateため、エラーが発生します。

この問題を解決するには、メソッドBeanPropertySqlParameterSourceのオーバーライドを拡張します。getValueオブジェクトの型が の場合、joda.time.DateTimeそれをオブジェクトに変換してjava.util.Date返します。これで問題は解決するはずです。

class CustomBeanPropertySqlParameterSource extends BeanPropertySqlParameterSource {
  @Override
  Object getValue(String paramName) {
     Object result = super.getValue(paramName);
     if (result instanceof DateTime) {
        return ((DateTime) result).toDate();
     } else {
        return result;
     }
  }
}
于 2011-10-11T05:10:24.060 に答える