【问题标题】:CriteriaBuilder Instant to postgres TIMESTAMP conversionCriteriaBuilder Instant 到 postgres TIMESTAMP 转换
【发布时间】:2020-05-18 11:20:43
【问题描述】:

我有一个 Postrges 数据库表,其中有一列 created_at TIMESTAMP WITHOUT TIMEZONE。 在该表中,有一条时间戳为2020-02-15 00:00:00 的记录。 在休眠实体中,该字段映射如下:

@Column(name = "created_at", updatable = false)
@CreationTimestamp
private Instant createdAt;

我正在尝试使用CriteriaAPI 查询记录。我以这种方式形成查询:

criteriaBuilder.greaterThanOrEqualTo(rootEntity.get("created_at"), Instant.ofEpochSecond(1581724800L).truncatedTo(ChronoUnit.DAYS))

数字1581724800L 对应于2020-02-15 00:00:00,所以它应该可以工作。但是,此查询不会返回我要查找的记录。 查看数据库日志,我发现它实际上查询了时间戳2020-02-15 03:00:00。因此,即使我在查询中使用 Instant 并且 DB 字段是 TIMESTAMP WITHOUT TIMEZONE,它也会将时间戳转换为分区时间戳。

可能是什么问题,我在这里做错了什么?

【问题讨论】:

  • 会不会是时区问题?看起来休眠以某种方式改变了时间并转移到不同的时区。也许尝试将其设置为 UTC spring.jpa.properties.hibernate.jdbc.time_zone = UTC 或尝试设置不同的时区,看看查询中的时间是否也发生了变化
  • 这绝对是一个时区问题,因为我在 UTC+3 时区。有了这个属性,这确实有效。而且我有点困惑,因为我使用的是没有时区的Instant,DB 列没有时区。请发表评论作为答案,以便我接受。如果您能解释为什么会发生这种情况,我将非常感激。
  • 我也不知道为什么或在哪里发生(我猜是在休眠中的某个地方),但我也遇到了同样的问题,所以听起来很熟悉

标签: java postgresql hibernate jpa criteria-api


【解决方案1】:

看起来休眠以某种方式改变了时间并转移到不同的时区。也许尝试将其设置为 UTC spring.jpa.properties.hibernate.jdbc.time_zone = UTC 或尝试设置不同的时区,看看查询中的时间是否也发生了变化

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-30
    • 2015-04-20
    • 2016-09-03
    • 2020-12-01
    • 2016-11-26
    • 2016-01-20
    • 2019-07-03
    • 1970-01-01
    相关资源
    最近更新 更多