问题描述
spring boot 2.2.11 升级到 2.3.9 后,我们应用程序中的一些数据库查询停止工作。当我降级到 2.3.8 时,它们再次工作。 所以从2.3.8到2.3.9肯定是有什么变化,但我还是没弄明白是什么。
我们使用 spring-data-jdbc 和 postgres 数据库。我们的存储库扩展了 CrudRepository:
public interface ExampleRepository extends CrudRepository<Example,Long>
有问题的查询如下所示:
@Query("SELECT * FROM example WHERE updated_at > :lastUpdate")
List<Example> findByUpdatedAtGreaterThan(@Param("lastUpdate") OffsetDateTime lastUpdate);
实体都扩展了一个类 BaseEntity,它有一个字段
private Timestamp updatedAt;
数据库列是使用 flyway 脚本设置的:
updated_at TIMESTAMPTZ NOT NULL DEFAULT Now()
这个时间戳是在 BeforeSaveEvent 上自动设置的:
this.updatedAt = Timestamp.from(Instant.Now().truncatedTo(ChronoUnit.MILLIS)));
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) OffsetDateTime lastUpdate
并收到类似 2011-01-01T10:20:30.123Z
传递给服务和存储库方法。
现在在 org.postgresql.jdbc.Timestamputils
(postgrsql-42.2.18-sources.jar) 中,我在方法中看到参数 lastUpdate
public synchronized @polyNull Timestamp toTimestamp(@Nullable Calendar cal,@polyNull String s)
然后private ParsedTimestamp parseBackendTimestamp(String str)
parseBackendTimestamp() 似乎需要一个时间戳,在日期和时间之间有一个空格,而不是一个“T”,所以我们得到了这一行
throw new NumberFormatException("Trailing junk on timestamp: '" + new String(s,start,slen - start) + "'");
结果:“时间戳上的尾随垃圾:'T10:20:30.123Z'”
我不知道为什么将参数传递到 parseBackendTimestamp() 中。使用 spring boot 2.3.8 这不会发生,postgresql 版本是相同的,42.2.18。 2.3.9 的 release notes 提到升级到 Spring Data Neumann-SR7,它带来了 弹簧数据 JDBC 2.0.7。 change log for 2.0.7 很短,只是一个似乎无关的错误修正。
知道这里发生了什么吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)