在 Spring Boot 3.2.0 中使用 JdbcTemplate 将 Java LocalDate 值保留在 Oracle DATE 列中时,我们遇到了意外行为。
在升级到 Spring Boot 3.2.0 之前,持久值的时间部分默认为 00:00:00(午夜)。不过,升级后,时间部分现在默认为 12:00:00(中午)。
例如,考虑下表和类:
CREATE TABLE EXAMPLE (
EXAMPLE_DATE DATE
);
@Repository
public class ExampleRepository {
private final JdbcTemplate jdbcTemplate;
public void insert() {
final String sql = "INSERT INTO EXAMPLE (EXAMPLE_DATE) VALUES (?)";
this.jdbcTemplate.update(sql, LocalDate.now());
}
}
使用此类插入 LocalDate 值后,以下数据将保留在示例表中:
SELECT to_char(EXAMPLE_DATE, 'YYYY-MM-DD HH24:MI:SS') FROM EXAMPLE;
2024-01-10 12:00:00
在此 Spring Boot 版本中,ojdbc11 已更新至 23.3.0.23.09。
重新安装 ojdbc11 21.11.0.0 会恢复该行为,并且持久时间组件再次默认为 00:00:00。
Java版本:17
如果您对这种意外行为以及如何解决它有任何见解,我们将不胜感激。
这是 23.3.0.23.09 版本的一个已知问题,它将在下一个版本(即 23.4)中修复,在此之前我建议您继续使用 21.11 版本的 JDBC jar。另请注意,23.3.0.23.09 是开发人员版本,因此您应避免在生产中使用它。