CriteriaBuilder Мгновенное преобразование postgres TIMESTAMP - PullRequest
2 голосов
/ 02 февраля 2020

У меня есть таблица БД Postrges, в которой есть столбец 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, оно преобразует временную метку в зонированную.

В чем может быть проблема и что я здесь не так делаю?

1 Ответ

2 голосов
/ 05 февраля 2020

Похоже, что Hibernate каким-то образом меняет время и переключается на другой часовой пояс. Возможно, попытайтесь установить его в UT C spring.jpa.properties.hibernate.jdbc.time_zone = UTC или попробуйте установить другой часовой пояс и посмотрите, не изменится ли время в запросе

...