8

情况是这样的:

PostgreSQL 数据库表有一个字段dateAddedtimestamp

Pojo 模型对象将此字段映射为

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

}

我的道实现是在 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 创建一个继承的类,但是...... mmhh .. 这是一个决赛。

--

编辑

根据 Erwin,我通过插入虚拟表测试了 DateTime 值 '2011-10-10T21:55:19.790+03:00' 并且它正在工作。但无法使用 JDBC。与 JDBC 驱动程序有关的东西?

4

1 回答 1

17

这里的问题JdbcTemplate是使用准备好的语句然后绑定值。有问题的字段是时间戳类型 - 因此需要将其设置为java.sql.Date. 在这种情况下,spring 调用通用setObject方法,将 Joda TimeDateTime实例传递给它。驱动程序不知道如何将其转换为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 回答