Выполнение даты / времени по математике в HQL? - PullRequest
16 голосов
/ 12 марта 2009

Я смотрю, как выполнить математику даты / времени в запросе HQL. В частности, как добавить или вычесть (x) количество времени из результата функции current_timestamp()? Или я должен зайти в SQL для этого и надеяться, что любая база данных, которую вы запускаете, поддерживает это?

Пример запроса HQL:

FROM RandomThing
WHERE randomTime IS NOT NULL AND
      randomTime >= current_timestamp() AND
      randomTime <= (current_timestamp() + :timeToAdd)

Я могу определить параметр: timeToSubtract как любую конкретную единицу, хотя что-либо большее, чем часы, будет нежелательным, а секунды - наиболее желательными.

РАЗЪЯСНЕНИЕ: я понимаю, что это легко сделать вне запроса. Но по философским причинам, скажем, важно использовать время сервера базы данных, а не время системы запросов. Практический пример: я запрашиваю автоматическую временную метку для всех записей, сделанных за последний (x) промежуток времени. Поскольку временная метка создается системой базы данных, важно также использовать текущее время базы данных.

Ответы [ 4 ]

10 голосов
/ 12 марта 2009

Зачем вам нужно сделать это в запросе? Почему бы просто не обработать это в коде Java.

например:

From RandomThing
Where randomTime is not null and
      randomTime >= :currentTimestamp and
      randomTime <= :maxTimestamp

А затем просто установите параметры.

4 голосов
/ 13 марта 2009

Вы можете определить синтаксис, чтобы сделать это, используя SQL в вашей базе данных, а затем определить функцию в пользовательском HibernateDialect. Например, нам нужна была функция дня недели, которая не является стандартным SQL. Мы подклассифицировали диалект для каждой базы данных, а затем добавили следующую строку:

registerFunction("weekday", 
  new SQLFunctionTemplate(Hibernate.INTEGER, "to_char(?1,'D')") );

В вашем случае вы могли бы использовать функцию с именем date_diff, которая может быть определена как? -? в некоторых базах данных или что-то другое в других. Таким образом, вам не нужно писать сырой SQL в вашем запросе, и если вам когда-либо понадобится переключать базы данных, вы просто отображаете функцию по-другому на своем диалекте.

3 голосов
/ 15 сентября 2009

Если вам нужно время сервера базы данных, вы можете сначала выполнить простой hql-запрос, чтобы получить метку времени, а затем вычислить maxTimestamp в java и передать извлеченную метку времени и вычисленный maxTimeStamp в запрос, подобный тому, что был в ccclark.

1 голос
/ 13 марта 2009

Это должен быть HQL? Я бы, вероятно, переключился на критерии гибернации и использовал бы:

Criteria.add( Restrictions.SQLRestriction( "{alias} <= current_timestamp() " ) )
Criteria.add( Restrictions.SQLRestriction( "{alias} >= (current_timestamp() + ?) ", 5 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...