Как использовать текущую дату в запросе HQL с базой данных Oracle?
Я пытаюсь написать этот запрос, используя Hibernate 3 и Oracle 10.
from Alert alert
where alert.expiration > current_date()
order by alert.priority, alert.updated, alert.name
Он создает SQL как это -
Hibernate: select alert0_.ANNOUNCEMENTS_ID as ANNOUNCE1_1_, alert0_.ANNOUNCEMENT
S_NAME as ANNOUNCE2_1_, alert0_.ANNOUNCEMENTS_PRIORITY as ANNOUNCE3_1_, alert0_.
ANNOUNCEMENTS_EXPIRATION as ANNOUNCE4_1_, alert0_.ANNOUNCEMENTS_UPDATE_DATE as A
NNOUNCE5_1_ from NYC311_ANNOUNCEMENTS alert0_ where (alert0_.ANNOUNCEMENTS_EXPIR
ATION>current_date()) order by alert0_.ANNOUNCEMENTS_PRIORITY , alert0_.ANNOUNC
EMENTS_UPDATE_DATE , alert0_.ANNOUNCEMENTS_NAME
Я получаю все эти дурацкие ошибки, такие как "недостающие правильные круглые скобки", когда есть, по-видимому, идеально сбалансированная скобка.
Почему Oracle так расстраивается? Есть ли лучший способ написать мой HQL-запрос?
Ответы
Ответ 1
Разве это не должно быть current_date
?
Hibernate переведет его на соответствующий диалект.
Я не нашел реального "Hibernate переведет это в эту" справочную документацию, но выражение, в общем, можно найти в Выражения HQL для Hibernate 4.3.
Затем существует спецификация Java Persistence API 2.0 (JPA), которая определяет выражения для языка запросов Java Persistence (JPQL) и их значение например для current_date
:
4.6.17.2.3 Функции даты и времени functions_returning_datetime: = CURRENT_DATE | CURRENT_TIME | CURRENT_TIMESTAMP Функции даты и времени вернуть значение текущей даты, времени и метки времени в базе данных сервер.
Ответ 2
Является ли current_date()
функцией гибернации?
Вместо этого я использовал бы sysdate
. например:
where alert.expiration > sysdate
Или игнорировать время суток:
where alert.expiration > trunc(sysdate)