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"));
}
我有一个 Spring 启动 API,它使用 Spring 数据 JPA (1.5.9)/Hibernate (5.0.12) 来查询我在 AWS 上托管的 PostgresQL 数据库作为 RDS。它设置为中央时间 (CST) 我有一些使用 CURRENT_TIMESTAMP
函数的 HQL (Hibernate) 查询,但不幸的是,奇怪的是,每当使用 CURRENT_TIMESTAMP
运行.
我需要一种方法来简单地强制 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"));
}