Как запросить дату в HQL (Hibernate) с помощью Joda Time? - PullRequest
8 голосов
/ 05 декабря 2009

Я уверен, что кто-то, знакомый с HQL (я сам новичок), может легко ответить на этот вопрос.

В моем приложении Grails есть следующий класс домена.

class Book {
  org.joda.time.DateTime releaseDate //I use the PersistentDateTime for persisting via Hibernate (that use a DATETIME type for MySQL DB)
}

В моем HQL-запросе я хочу получить книги, дата выпуска которых включена в диапазон date1 .. date2

Например, я пытался:

DateTime date1, date2
... 
def queryStr = "select * from Book as b where b.releaseDate > $date1 and b.releaseDate < $date2" 
def res = Book.executeQuery(queryStr)

Но я получил исключение ...caused by: org.springframework.orm.hibernate3.HibernateQueryException: unexpected token: Токен ошибки указывает на формат даты (например, 2009-11-27T21:57:18.010+01:00 или Fri Nov 27 22:01:20 CET 2009)

Я также безуспешно пытался преобразовать date1 в класс Date

Так, каков правильный код HQL? Должен ли я конвертировать в определенный формат (какой?), Используя метод patternForStyle, или есть другой способ очистки?

Спасибо

Фабьен.

Ответы [ 3 ]

7 голосов
/ 05 декабря 2009

Я не эксперт по Grails, но в Java вы обычно делаете date1 и date2 параметры запроса и связываете их так:

String hql = "select * from Book as b where b.releaseDate > :date1 and b.releaseDate < :date2";
session.createQuery(hql).setDate("date1", date1).setDate("date2", date2).list();

Я уверен, что вы можете сделать что-то подобное в Grails. Если нет, отформатируйте даты как yyyyMMddhhmmss (без пробелов) и заключите их в одинарные кавычки - таким образом Hibernate будет рассматривать их как константы, а MySQL неявно преобразует их в даты.

5 голосов
/ 05 декабря 2009

Я указал ChssPly, вы должны объявить date1 и date2 как параметры запроса (позиционные или именованные), а затем связать их. Здесь мы будем использовать именованные параметры. Обычный способ передачи именованных параметров запроса с помощью Grails - через Map:

def queryStr = "from Book b where b.releaseDate > :date1 and b.releaseDate < :date2"
Book.executeQuery(queryStr, [date1: date1, date2: date2])

Проверьте executeQuery() документацию для подробностей синтаксиса обеих опций.

3 голосов
/ 11 ноября 2011

Вы также можете сравнивать даты, используя формат даты ISO8601, например:

select * from Book as b 
where b.releaseDate > '2009-11-27T21:57:18.010+01:00' 
and b.releaseDate < '2010-11-27T21:57:18.010+01:00'

Я проверил это, используя MySql в качестве серверной части. Просто не забудьте свернуть даты в строку.

...