【问题标题】:Spring data query for localdate returns wrong entries - minus one daylocaldate 的 Spring 数据查询返回错误的条目 - 减去一天
【发布时间】:2021-02-21 14:02:58
【问题描述】:

在我的实体中,我在 MySQL 中有一个类型为 LocalDate“day”的字段,它被映射到“date”类型。

MySQL 似乎在 UTC 上运行 SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP); 正在返回 00:00:00。我的系统正在运行 CET (UTC+1)

如果我通过 sql 查询它(来自 IntelliJ 的控制台配置了 空时区)查询

select * from table where day = '2020-10-18';

返回正确日期的条目。

使用 Spring 数据 findByDay 指定的查询看起来也正确:

2020-11-09 16:16:32.911 DEBUG 5600 --- [main] org.hibernate.SQL:从表 entity0_ 中选择 {所有字段},其中 entity0_.tag=? 2020-11-09 16:16:32.924 TRACE 5600 --- [main] o.h.type.descriptor.sql.BasicBinder:绑定参数 [1] 作为 [DATE] - [2020-10-18]

但它返回的条目 date = 2020-10-17

因此我的测试总是失败:

@Test
void getWithoutMeldebereiche() {
    LocalDate of = LocalDate.of(2020, 10, 18);
    List<Entity> without =
            repository.findByDay(of);
    assertThat(without, is(not(empty())));
    assertThat(without.get(0).getTag(), is(of) ); //fails due to wrong date
}

数据源也被配置为不带时区(就像在 IntelliJ 中配置的那样):

spring.datasource.url=jdbc:mysql://localhost:3306/database?useUnicode=yes&characterEncoding=UTF8

如何使这个查询和测试独立于客户端(系统时区)服务器(数据库类型,服务器时区)(我无法控制它们)?如果我通过 IntelliJ 查询为什么它可以工作 - 也没有设置时区?

有没有比映射到“日期”的“LocalDate”更好的类型可以用于这个用例,它们是真正的日期,因此是无时区的?

到目前为止我尝试了什么: 不工作:

  • spring.jpa.properties.hibernate.jdbc.time_zone=CET 没有帮助
  • spring-boot.run.jvmArguments=-Duser.timezone=UTC 不工作

工作但让我依赖于目标环境中的设置:

  • 在连接 url 帮助上添加 &serverTimezone=Europe/Berlin 但这在其他环境中我无法控制。这仅适用于 MySql。
  • 添加TimeZone.setDefault(TimeZone.getTimeZone("UTC")); 作品

【问题讨论】:

    标签: mysql datetime time timezone spring-data


    【解决方案1】:

    8.0.22 之前的 MySQL 连接器/J 中存在错误。更新到 8.0.22 将解决此问题。

    来自8.0.22 changelog

    LocalDate、LocalDateTime 和 LocalTime 值通过 Connector/J 设置 当服务器之间存在时区差异时被更改 和客户。此修复通过处理 LocalDate 来纠正问题, LocalTime 和 LocalDateTime,没有时区转换,也没有 到其他日期时间类的中间转换。

    潜在的错误: https://bugs.mysql.com/bug.php?id=93444

    【讨论】:

    • 你拯救了我的一天——这确实有帮助。它现在可以在没有设置的情况下工作 - 应该如此。
    • 我使用的是 8.0.25,我遇到了同样的问题
    • 在我将 pom.xml 自动定义的 spring 版本更改为显式 mysql 版本 8.0.26 之后,它开始产生正确的结果,这很奇怪,因为自动管理的版本是相同的。 * 编辑:它在干净构建运行后 -1 天开始做同样的事情......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多