JodaTime и BeanPropertySqlParameterSource

Ситуация примерно такая:

В таблице базы данных PostgreSQL есть поле dateAdded, которое равно timestamp.

Объект модели Pojo сопоставляет это поле как

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

}

Моя реализация Dao находится в шаблоне Spring JDBC и выглядит следующим образом:

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

Я читаю модель с клиента и создаю объект, используя @Model. Пока все в порядке. Когда я выполняю это, база данных выдает исключение, говорящее:
[Edit Erwin]: Оказывается, исключение исходит не из базы данных.

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

Я не хочу выполнять форматирование вручную, реализуя полный оператор INSERT, поскольку задействовано много полей.

Каково наилучшее возможное решение здесь? Есть ли способ настроить toString() из DateTime на все вызовы. Я также думал о создании унаследованного класса от DateTime, но ... ммхх ... это финал.

--

Редактировать

Согласно Эрвину, я проверил значение DateTime «2011-10-10T21:55:19.790+03:00», вставив его в фиктивную таблицу, и оно работает. Но не могу работать с JDBC. Что-то связанное с драйвером JDBC?


person Firdous Amir    schedule 10.10.2011    source источник
comment
«2011-10-10T21:55:19.790+03:00» допустимо для отметки времени во всех известных мне версиях PostgreSQL. Какова ваша версия? Может ли быть так, что одинарные кавычки вокруг временной метки (которую я добавил здесь) отсутствуют в вашем операторе SQL? Если это не так, можете ли вы показать нам соответствующий журнал сервера postgresql, это устранит путаницу.   -  person Erwin Brandstetter    schedule 11.10.2011
comment
Postgres 9. Дело в том, что я не пишу здесь инструкцию SQL Insert. Я просто создаю объект модели, оборачиваю его с помощью BeanPropertySqlParameterSource и помещаю в объект Spring JDBC SimpleJdbcInsert. Это внутренне позаботится о ВСТАВКАХ SQL. И вы правы. Я только что проверил то же значение, используя фиктивную таблицу, и она работает. Это совершенно странно.   -  person Firdous Amir    schedule 11.10.2011
comment
Эрвин, потребовалось некоторое время, чтобы найти журнал сервера Pgsql. При выходе из этого действия нет сообщения об ошибке.   -  person Firdous Amir    schedule 11.10.2011
comment
Не могу помочь вам с частью JDBC, мой опыт связан с postgresql. Если JDBC просто ошибается в синтаксисе, вы можете обойти проблему, предоставив альтернативный синтаксис, такой как '2011-10-10 21:55:19.790+03:00'. T, будучи совершенно законным, необычен.   -  person Erwin Brandstetter    schedule 11.10.2011
comment
Спасибо, Эрвин. Надеюсь, у кого-то еще есть ответ. Как вы сказали, я тоже чувствую это странно.   -  person Firdous Amir    schedule 11.10.2011


Ответы (1)


Проблема здесь в том, что JdbcTemplate использует подготовленный оператор, а затем привязывает значения. Рассматриваемое поле представляет собой временную метку типа, поэтому его необходимо установить как java.sql.Date. В этом случае spring вызывает общий метод setObject, передавая ему экземпляр Joda Time 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;
     }
  }
}
person gkamal    schedule 11.10.2011