java - JPA/Hibernate order by of a Joda time of the day 在香港无法正常工作

标签 java hibernate postgresql jpa jodatime

我的问题是,当我使用 startTime 的顺序对数据库进行查询时,其中 startTime 是一个 Joda 时间,它返回从下午 4 点开始的时间。

现在,下午 4 点距离午夜 12 点刚好 8 小时,巧合的是我住在香港,那是我的时区,香港时区距离午夜 8 小时。

我的 startTime JPA 字段是:

@Index(name = "bookingStartTimeIndex")
@Column(name = "start_time")
@Type(type="org.joda.time.contrib.hibernate.PersistentLocalTimeAsTime")
private LocalTime startTime;

我使用 JPA/Hibernate,我的查询基本上是选择 * where:

order by b.startTime asc

现在,我将时间为上午 9 点到下午 6 点的实体存储在该表中。从这个“order by”返回的是从下午 4 点开始到下午 6 点然后从上午 9 点到下午 4 点的实体。 所以看起来它以某种方式决定下午 4 点是午夜。

这是一个 postgresql 数据库,当我查看我的数据库时,colum 的数据类型为 time_without_time_zone。

那么我怎样才能让它在上午 9 点到下午 6 点之间正常订购实体呢?


我发现的解决方法是更改​​为使用 PersistentLocalTimeExact,这适用于 我在我提到的条件下解决了我在下午 4 点遇到的所有问题...

@Index(name = "bookingStartTimeNumberIndex") @Column(name = "start_time_number", nullable = true) @Type(type="org.joda.time.contrib.hibernate.PersistentLocalTimeExact") 私有(private)本地时间开始时间编号;

最佳答案

这听起来像是一个数据呈现的问题,而不是一个基本问题,尽管它有点不清楚。

您是说数据库中时间为 0:00 的记录在从数据库中取回时显示为 16:00?如果是这样,那么我认为从数据库中读取日期会有些困惑,并且在 Hibernate 扩展中的某个地方,Joda Time 正在创建 LocalTime 实例,假设数据库时间是 UTC,然后创建 LocalTime 与您本地的时区,因此应用 -8 小时偏移量。

正如 Erwin 所说,在数据库中存储时区是更好的方法,或者如果您不能这样做,则只存储 UTC 日期和/或时间。

我查看了 Joda Time网站,他们推荐 different与您正在使用的原始扩展相比,Hibernate 扩展得到更好的支持。

您也可以尝试在 PersistentLocalTimeAsTime 类上设置断点,看看 LocalTime 是如何构建的。

关于java - JPA/Hibernate order by of a Joda time of the day 在香港无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8644910/

相关文章:

java - 桌面上的 libGDX Midi 音量控制

java - 我的程序在超过 100 个字符的键上出现滞后

java - Hibernate 不再记录任何内容,因为我重新定位了 log4j.xml 和 hibernate.properties 文件

postgresql - Hasura 使用 SSL 证书进行 Postgres 连接

java - Vaadin anchor - 捕获默认点击事件

Java:如何将带有月份名称的字符串转换为日期时间?

java - @LastModifiedDate 导致数据库中的额外更新

java - 我应该包含 JPA 的 main 方法吗?

python - 升级到 Django 1.8.13。测试失败但应用程序有效。 Postgresql 表重复

sql - GROUP BY 外键和日期范围