gpt4 book ai didi

spring - JodaTime 和 BeanPropertySqlParameterSource

转载 作者:行者123 更新时间:2023-11-29 11:26:25 25 4
gpt4 key购买 nike

情况是这样的:

PostgreSQL 数据库表有一个字段 dateAddedtimestamp

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 创建一个继承的类,但是......嗯......这是最终的。

--

编辑

Per Erwin,我通过插入虚拟表来测试 DateTime 值“2011-10-10T21:55:19.790+03:00”,它正在运行。但是无法使用 JDBC。与 JDBC 驱动程序相关的内容?

最佳答案

这里的问题是 JdbcTemplate 使用准备好的语句然后绑定(bind)值。有问题的字段是时间戳类型 - 因此需要将其设置为 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;
}
}
}

关于spring - JodaTime 和 BeanPropertySqlParameterSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7717945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com