Как назначить параметры даты для запроса Hibernate для текущего часового пояса? - PullRequest
32 голосов
/ 15 ноября 2008

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

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

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

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

Спасибо.

Ответы [ 5 ]

62 голосов
/ 17 января 2009

Как оказалось, Hibernate не конвертирует даты в GMT автоматически, он просто сокращает время, если вы используете query.setDate(), поэтому, если вы передадите «2009-01-16 12:13:14», он станет «2009- 01-16 00:00:00 ".

Чтобы учесть время, вам нужно использовать query.setTimestamp("date", dateObj).

2 голосов
/ 17 ноября 2011

Если вам нужно синхронизированное значение timeZone , вы можете использовать now () в вашем HQL. Также я предлагаю вам воспользоваться библиотекой Joda. Имеет модуль hibernate-plugin.

2 голосов
/ 15 ноября 2008

Мы используем пользовательский тип даты Hibernate. Каждый раз, когда мы устанавливаем параметр в запросе, мы используем базовый класс или служебный метод, чтобы мы могли передать часовой пояс пользователя в параметр пользовательского типа.

Вы можете обойтись, просто вручную установив время в служебном методе для запросов, но таким образом даты, которые считываются или записываются в базу данных, также правильно конвертируются. Этот метод также обрабатывает ситуацию, когда база данных хранит дату в своем часовом поясе. Таким образом, даже если у вас есть пользователь в одном часовом поясе, сервер базы данных в другом, а 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 на следующий день. В пользовательском типе мы проверяем это и отменим его.

2 голосов
/ 15 ноября 2008

Hibernate не знает часовых поясов. Любое преобразование часового пояса должно быть выполнено до выполнения запроса.

Например, если ваш сервер баз данных настроен на CST, но пользователь находится на EST, вам нужно будет добавить 1 час к любым временным меткам, которые являются входными данными для запроса.

1 голос
/ 17 июля 2018

Команда Hibernate устарела setTimestamp (String name, Date val) , а также интерфейс org.hibernate.Query с версии 5,2 :

 /* @deprecated (since 5.2) use {@link #setParameter(int, Object)} or
    {@link #setParameter(int, Object, Type)}  instead
 */

Так что вы можете использовать ниже код:

import org.hibernate.query.Query;
...
Query query = session.createQuery("from Table where date_field < :now");
query.setParameter("now", new Date(), TimestampType.INSTANCE );

Примечательно, что setDate метод, который сокращает часть времени, также не рекомендуется и может быть заменен этой опцией (из того же интерфейса org.hibernate.query.Query):

query.setParameter("firstMomentOfToday", new Date(), DateType.INSTANCE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...