Использование HQL для запроса даты, игнорируя время в Oracle - PullRequest
15 голосов
/ 11 июня 2009

У меня есть таблица (в Oracle 9 и выше), где мне нужно найти все записи за определенный день, используя Hibernate. Записи имеют метки времени (с типом данных «дата»). У некоторых записей есть время, у других - только дата. Это нельзя изменить, так как это вывод других приложений, которые я не могу изменить. В SQL я бы написал что-то вроде

SELECT * FROM table WHERE trim(table.date) = to_date('11.06.2009')

, чтобы получить все записи на дату, которую я ищу. Мне было интересно, как я могу заставить Hibernate сделать это, используя HQL. Я знаю, что могу использовать SQL-запросы в Hibernate, но это, кажется, менее чисто. Есть ли способ сделать это? Если возможно, этот способ также должен работать с базами данных без оракула, где отметкой времени будет тип данных.

Ответы [ 4 ]

15 голосов
/ 11 июня 2009

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

т.е.

table.date >=11.06.2009 AND table.date < 11.07.2009

HQL (а также SQL) также позволяет:

table.date between 11.06.2009 AND 11.07.2009

Имейте в виду, between всегда включительно, то есть, соответственно, >= и <=.
Подробнее о between здесь: http://www.coding -dude.com / wp / java / hibernate-java / hibernate-hql -ween-expression /

2 голосов
/ 06 января 2011

Для CustomHQL , вы можете попробовать ключевое слово trunc

Например:

SELECT T0.FirstName as FirstName ,T0.LastLoginDate as LastLoginDate  FROM User T0
WHERE (trunc(T0.LastLoginDate) >= :LastLoginDate) ORDER BY T0.LastLoginDate 

ПРИМЕЧАНИЕ: Где :LastLoginDate - параметр.

Это помогает мне.

2 голосов
/ 11 июня 2009

Я думаю, что есть два способа решить эту проблему:

  1. Используйте критерий запрос и добавьте SQLRestriction . Ограничение будет принимать форму «trim ({alias} .date) =?». Проблемой здесь может быть преобразование входного параметра в правильный тип в Oracle (или другой СУБД). В качестве параметра можно указать необходимый (спящий) тип, но если это зависит от базы данных, он будет жестко задан.

  2. используйте формулу в своем отображении спящего режима. Отображение будет:

    <class name="Person">
      <property name="birthDay" formula="trim(birthDay)"/>
    </class>

Теперь вы можете использовать систему ввода Hibernate, чтобы использовать сравнение с Java-объектом, например так:

s.createCriteria(Person.class)
 .add(Restrictions.eq("birthDay", new java.sql.Date(System.currentTimeMillis())))
 .list()

Одна из проблем, с которой вы столкнетесь в обоих решениях, заключается в том, что функция trim может быть недоступна в базе данных. Решением для этого (например, во время тестирования на HSQLDB) является добавление import.sql в ваш тест пути к классам (он будет автоматически выбран Hibernate) и создание там процедуры или функции. Вы также можете Alter table Person add column birthDay timestamp в этом файле, чтобы сгенерированная схема работала.

0 голосов
/ 11 ноября 2009

вы можете использовать функцию trunc () для удаления временной части в столбце DATE.

Например: select * from emp where trunc(emp_date) < trunc(current_date()-30)

получает все данные о сотрудниках, которые были заняты за 1 месяц до

...