Как назначить параметры даты для запроса Hibernate для текущего часового пояса?
Когда вы назначаете дату именованному параметру SQL, Hibernate автоматически преобразует его в GMT. Как вы используете текущий часовой пояс сервера для всех дат?
Допустим, у вас есть запрос:
Query q = session.createQuery("from Table where date_field < :now");
q.setDate("now", new java.util.Date());
"now" будет установлено в GMT, а "новая дата()" получит ваше текущее время сервера.
Спасибо.
Ответы
Ответ 1
Как оказалось, Hibernate не преобразовывает даты в GMT автоматически, он просто сокращает время, если вы используете query.setDate()
, поэтому, если вы пройдете "2009-01-16 12:13:14", он станет "2009- 01-16 00:00:00".
Чтобы учесть время, вам нужно использовать query.setTimestamp("date", dateObj)
.
Ответ 2
Спящий режим не знает временных зон. Любое изменение часового пояса должно выполняться до выполнения запроса.
Например, если ваш сервер базы данных установлен в CST, но пользователь находится в EST, вам нужно добавить 1 час к отметкам времени, которые являются входными данными запроса.
Ответ 3
Мы используем настраиваемый тип даты в спящем режиме. Каждый раз, когда мы устанавливаем параметр в запросе, мы используем базовый класс или метод утилиты, поэтому мы можем передать часовой пояс пользователя в параметр настраиваемого типа.
Вы могли бы просто вручную настроить время в методе утилиты для запросов, но так же даты, которые считываются или записываются в базу данных, также правильно преобразуются. Этот метод также обрабатывает ситуацию, когда база данных хранит дату в локальном часовом поясе. Таким образом, даже если у вас есть пользователь в одном часовом поясе, сервер базы данных в другом и Java, использующий GMT, он может получить все прямо. Он выглядит следующим образом:
Properties properties = new Properties();
properties.setProperty("timeZone", databaseTimeZone);
query.setParameter("from", dateEnteredByUser, Hibernate.custom(LocalizedDateType.class, properties));
В качестве дополнительного бонуса мы используем это, чтобы иметь дело с тем, что SQL Server конвертирует 23: 59: 59.999 на следующий день. В пользовательском типе мы проверяем это и отключаем его.
Ответ 4
Если вам нужно синхронизировать значение timeZone, которое вы можете использовать сейчас() в своем HQL. Также я предлагаю вам использовать библиотеку Joda. Он имеет модуль спящего модуля.