Я хотел бы знать, как будет выполняться сравнение в следующем запросе:
StringBuilder queryStr = new StringBuilder();
queryStr.append("SELECT o FROM PRDBook as o WHERE ")
.append("o.publicationDate < :now");
Query query = entityManager.createQuery(queryStr.toString());
Date now = new Date();
query.setParameter("now", now);
В базе данных column publicationDate
имеет timestamp without time zone
типа timestamp without time zone
. Примерное значение в этом столбце:
2018-03-01 18:00:00
Результатом now.toString()
является:
Wed Aug 22 16:14:03 CEST 2018
Будет ли выполняться сопоставление между указанными данными таким образом:
2018-03-01 18:00:00 <2018-08-22 16:14:03
или так:
2018-03-01 18:00:00 <2018-08-22 14:14:03
Интересный вопрос.
Когда драйвер PostgreSQL JDBC читает столбец типа timestamp without time zone
, он обычно может читать его в java.sql.Timestamp
или java.util.Date
.
Если вы решите прочитать его на java.util.Date
(ваш случай) Драйвер PostgreSQL JDBC автоматически добавляет к нему локальный часовой пояс JVM. Это имеет смысл, поскольку вся точка столбца типа timestamp without time zone
должна рассматриваться как "локальная" метка времени.
И наоборот, когда вы отправляете java.util.Date
в базу данных, он сразу же удаляет часовой пояс. Поэтому условие запроса примет форму:
2018-03-01 18:00:00 <2018-08-22 16:14:03
Взаимозависимо это означает, что он рекомендовал установить часовой пояс JVM явно, чтобы убедиться, что драйвер JDBC повторно собирает timestamp without time zone
базы данных timestamp without time zone
в java.util.Date
правильным способом.
В противном случае разные серверы в разных часовых поясах, читающих одну и ту же строку в одной базе данных, будут интерпретировать эту временную метку как другой момент времени. Тем не менее, это, вероятно, не должно быть допустимым вариантом использования приложения, которое использует "локальные" временные метки.
java.util.Date
нет часового пояса; это просто абстрактный момент времени. Вы пытались запустить свой код, чтобы увидеть, что на самом деле происходит? Итак, я голосую за первую версию, которая и будет.