Подтвердить что ты не робот

Как назначить параметры даты для запроса Hibernate для текущего часового пояса?

Когда вы назначаете дату именованному параметру SQL, Hibernate автоматически преобразует его в GMT. Как вы используете текущий часовой пояс сервера для всех дат?

Допустим, у вас есть запрос:

Query q = session.createQuery("from Table where date_field < :now");
q.setDate("now", new java.util.Date());

"now" будет установлено в GMT, а "новая дата()" получит ваше текущее время сервера.

Спасибо.

4b9b3361

Ответ 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. Он имеет модуль спящего модуля.