web-dev-qa-db-fra.com

Comment utiliser la date actuelle dans une requête HQL avec une base de données Oracle?

J'essaie d'écrire cette requête en utilisant Hibernate 3 et Oracle 10.

from Alert alert
where alert.expiration > current_date()
order by alert.priority, alert.updated, alert.name

Il crée du SQL comme ça -

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

Je reçois toutes ces erreurs farfelues comme "parenthèse droite manquante" quand il y a des parenthèses apparemment parfaitement équilibrées.

Pourquoi Oracle panique-t-il à cela? Existe-t-il un meilleur moyen d'écrire ma requête HQL?

33
bpapa

Cela ne devrait-il pas être current_date?

Hibernate le traduira dans le dialecte approprié.

Je n'ai pas trouvé de véritable documentation de référence "Hibernate traduira ceci en cette", mais l'expression, en général, peut être trouvée dans Expressions HQL pour Hibernate 4. .

Ensuite, il y a la spécification Java Persistence API 2.0 (JPA) qui définit les expressions pour le Java langage de requête de persistance (JPQL) et leur signification, par exemple pour current_date:

4.6.17.2.3 Fonctions Datetime functions_returning_datetime: = CURRENT_DATE | CURRENT_TIME | CURRENT_TIMESTAMP Les fonctions datetime renvoient la valeur de la date, de l'heure et de l'horodatage actuels sur le serveur de base de données.

48
Michael Pralow

current_date() est-elle une fonction de mise en veille prolongée?

J'utiliserais à la place sysdate. comme ça:

where alert.expiration > sysdate 

Ou pour ignorer l'heure de la journée:

where alert.expiration > trunc(sysdate) 
8
Lost in Alabama