首页 > 解决方案 > CriteriaBuilder Instant 到 postgres TIMESTAMP 转换

问题描述

我有一个 Postrges DB 表,其中有一列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在查询中,它也会将时间戳转换为分区时间戳。

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

标签: javapostgresqlhibernatejpacriteria-api

解决方案


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


推荐阅读