加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

spring – JodaTime和BeanPropertySqlParameterSource

发布时间:2020-12-15 01:43:15 所属栏目:大数据 来源:网络整理
导读:情况是这样的: PostgreSQL数据库表有一个字段dateAdded,它是时间戳 Pojo模型对象将此字段映射为 class MyModel{ org.joda.time.DateTime dateAdded;} 我的Dao实现是在Spring JDBC Template中,它如下: SqlParameterSource parameters = new BeanPropertySql

情况是这样的:

PostgreSQL数据库表有一个字段dateAdded,它是时间戳

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

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

}

我的Dao实现是在Spring JDBC Template中,它如下:

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

这里最好的解决方案是什么?有没有办法在所有调用上配置DateTime的toString().我还想过从DateTime创建一个继承的类但是… mmhh ..这是一个决赛.

编辑

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

最佳答案
这里的问题是JDBCTemplate正在使用预准备语句然后绑定值.有问题的字段是时间戳类型 – 因此需要将其设置为java.sql.Date.在这种情况下,spring调用泛型setObject方法,将joda时间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 != null && result instanceof DateTime) {
        return ((DateTime)result).toDate();
     } else {
        return result;
     }

  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读