java - 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
在查询中,它也会将时间戳转换为分区时间戳。
可能是什么问题,我在这里做错了什么?
解决方案
看起来休眠以某种方式改变了时间并转移到不同的时区。也许尝试将其设置为 UTCspring.jpa.properties.hibernate.jdbc.time_zone = UTC
或尝试设置不同的时区,看看查询中的时间是否也发生了变化
推荐阅读
- nginx - NGINX Websocket 代理立即关闭
- sql-server - 在特定深度使用 group by 的 CTE 递归
- kotlin - 主函数在协程之前终止
- templates - 将关系数据库与指纹读取器集成
- graphdb - 没有通过批量或工作台从 RDFXML 文件加载数据
- java - predic8 wsdl 解析器在读取 include xsd 语句后停止
- node.js - 实时数据库触发通知
- character-encoding - 使用 UTF8 字符集创建 Informix 实例
- php - Angular 视图作为 PHP
- sql-server - 将地理转换为wkt时sql中的STAsText()和ToString()有什么区别