У меня есть Spring Boot API, который использует данные Spring JPA (1.5.9) / Hibernate (5.0.12) для запроса моей базы данных PostgresQL, размещенной на AWS как RDS. Для него установлено центральное время (CST). У меня есть несколько запросов HQL (Hibernate), в которых используется функция CURRENT_TIMESTAMP, но, к сожалению, как ни странно, похоже, что они возвращают значения UTC всякий раз, когда запросы HQL используют CURRENT_TIMESTAMP запустить.

Мне нужен способ просто заставить CURRENT_TIMESTAMP в запросе HQL быть центральным временем (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);

Любая помощь будет принята с благодарностью. У меня БД настроена как CST в AWS, поэтому я даже не ожидал, что этот CURRENT_TIMESTAMP вернет значение UTC (для меня все еще не имеет смысла, если только он каким-то образом не использует драйвер JDBC TimeZone или JVM? Я имею в виду, что это запрос Hibernate, так что это не чистый SQL, верно?)

0
ennth 26 Фев 2021 в 11:05

2 ответа

Лучший ответ

Отправляю свой ответ;

Я попытался установить часовой пояс в свойствах / yaml в этой статье: https://moelholm.com/blog/ 09.11.2016 / spring-boot-control-timezones-with-hibernate

Но что бы я ни пробовал, это не сработало. Я убедился, что нахожусь в спящем режиме 5.2.3 или выше, и это не сработает.

Я также попытался добавить «AT TIMEZONE» в свой запрос HQL, но код не компилировался. Я предполагаю, что, хотя это действительный SQL, он не работает с SQL-запросами Hibernate, т.е.

CURRENT_TIMESTAMP at TIME ZONE 'America/Chicago'

В любом случае, единственное, что работало, это:

@PostConstruct
  void started() {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
  }
0
ennth 1 Мар 2021 в 05:14

Вам следует попытаться установить часовой пояс гибернации в файле свойств весенней загрузки. Пример:

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

Убедитесь, что значение YOUR_TIMEZONE совпадает с часовым поясом вашей БД.

Думаю, эта статья поможет

1
byteHunt3r 26 Фев 2021 в 11:02