【问题标题】:JodaTime and BeanPropertySqlParameterSourceJodaTime 和 BeanPropertySqlParameterSource
【发布时间】:2011-12-04 19:12:07
【问题描述】:

情况是这样的:

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 语句来手动进行格式化,因为涉及的字段很多。

这里最好的解决方案是什么?有没有办法在所有呼叫中配置DateTimetoString()。我也想过从 DateTime 创建一个继承的类,但是……嗯……这是最终的。

--

编辑

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

【问题讨论】:

  • '2011-10-10T21:55:19.790+03:00' 对于我知道的所有 PostgreSQL 版本中的时间戳都有效。你的版本是什么?您的 SQL 语句中是否缺少时间戳(我在此处添加)周围的 单引号?如果还不行,能否给我们看一下对应的postgresql服务器日志,这样就可以解惑了。
  • Postgres 9. 事情是这样的,我不是在这里写 SQL 插入语句。我只是构建模型对象,使用 BeanPropertySqlParameterSource 包装它,然后将其推送到 Spring JDBC SimpleJdbcInsert 对象。这将在内部处理 SQL INSERTS。你是对的。我刚刚使用虚拟表测试了相同的值并且它正在工作。这太奇怪了。
  • Erwin,花了一段时间才找到 Pgsql 服务器日志。没有从该操作中注销的错误消息。
  • 无法帮助您处理 JDBC 部分,我的专长在于 postgresql。如果 JDBC 的语法有误,您可以通过提供替代语法(如 '2011-10-10 21:55:19.790+03:00')来解决此问题。 T,虽然完全合法是不寻常的。
  • 谢谢欧文。希望别人有答案。正如你所说,我也觉得很奇怪。

标签: spring postgresql datetime jodatime spring-jdbc


【解决方案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;
     }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-22
    • 2021-06-22
    • 2013-01-26
    • 1970-01-01
    • 2014-05-13
    • 2016-06-06
    • 2019-03-07
    • 1970-01-01
    相关资源
    最近更新 更多