Return CURRENT_TIMESTAMP Spring 数据 JPA/Hibernate (HQL) 查询中具有特定时区的值?

Return CURRENT_TIMESTAMP value with specific timezone in Spring data JPA/Hibernate (HQL) query?

我有一个 Spring 启动 API,它使用 Spring 数据 JPA (1.5.9)/Hibernate (5.0.12) 来查询我在 AWS 上托管的 PostgresQL 数据库作为 RDS。它设置为中央时间 (CST) 我有一些使用 CURRENT_TIMESTAMP 函数的 HQL (Hibernate) 查询,但不幸的是,奇怪的是,每当使用 CURRENT_TIMESTAMP 运行.

的 HQL 查询

我需要一种方法来简单地强制 HQL 查询中的 CURRENT_TIMESTAMP 中央时间 (CST)。我只是尝试在纯 SQL 中查询数据库,类似这样的方法有效:

CURRENT_TIMESTAMP at TIME ZONE 'America/Chicago'

不幸的是,我似乎无法让它在 HQL 中工作,因为 IntelliJ/Hibernate 抛出一个编译错误:

<expression> GROUP, HAVING, or ORDER expected, got 'AT'

我使用的示例 HQL 查询是:

@Query(value = "SELECT customerCoupons FROM CustomerCouponsEntity customerCoupons " 
+ "WHERE customerCoupons.couponCode = :couponCode "
+ "AND customerCoupons.expiredDate >= CURRENT_TIMESTAMP "
+ "AND customerCoupons.startDate <= CURRENT TIMESTAMP "
)

List<CustomerCouponsEntity> findByCouponCode(@Param("couponCode") String couponCode);

如有任何帮助,我们将不胜感激。我在 AWS 中将数据库设置为 CST,所以我什至没想到这个 CURRENT_TIMESTAMP 会 returning UTC 值(对我来说仍然没有意义,除非它以某种方式使用 JDBC 驱动程序 TimeZone 或 JVM?我的意思是,这是一个 Hibernate 查询,所以它不是纯粹的 SQL 对吗?)

您应该尝试在 spring 引导属性文件中设置休眠时区。示例:

spring.jpa.properties.hibernate.jdbc.time_zone=YOUR_TIMEZONE

确保 YOUR_TIMEZONE 的值与您的数据库时区匹配。

我想这 article 会有所帮助

发布我自己的答案;

我尝试根据这篇文章在 properties/yaml 中设置时区: https://moelholm.com/blog/2016/11/09/spring-boot-controlling-timezones-with-hibernate

但不管我怎么试,都不管用。我确定我使用的是 hibernate 5.2.3 或更高版本,但它不起作用。

我还尝试在我的 HQL 查询中添加“AT TIMEZONE”,但代码无法编译。我想即使这是有效的 SQL 但它不适用于 Hibernate SQL 查询,即

CURRENT_TIMESTAMP at TIME ZONE 'America/Chicago'

无论如何,唯一似乎有效的是:

@PostConstruct
  void started() {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
  }