JodaTime и BeanPropertySqlParameterSource - PullRequest
5 голосов
/ 10 октября 2011

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

Таблица базы данных PostgreSQL имеет поле dateAdded, равное timestamp

Объект Pojo Model отображает это поле как

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

}

Моя реализация Dao представлена ​​в Spring JDBC Template и выглядит так:

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

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

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?

1 Ответ

13 голосов
/ 11 октября 2011

Проблема здесь в том, что JDBCTemplate использует подготовленный оператор, а затем связывает значения.Поле, о котором идет речь, имеет тип timestamp, поэтому его нужно установить как java.sql.Date.В этом случае Spring вызывает универсальный метод setObject, передавая ему экземпляр DateTime времени joda.Драйвер не знает, как преобразовать это в 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 != null && result instanceof DateTime) {
        return ((DateTime)result).toDate();
     } else {
        return result;
     }

  }
}
...