Utiliser HQL pour interroger une date sans tenir compte de l'heure sur Oracle
J'ai une table (dans Oracle 9 et plus) où j'ai besoin de trouver toutes les entrées à un jour donné de l'utilisation d'Hibernate. Les inscriptions ont horodateurs (avec des données de type 'date'). Certaines entrées ont un temps, d'autres n'ont une date. Ce ne peut pas être changé, c'est la sortie de d'autres applications que je ne peux pas changer. En SQL, je voudrais écrire quelque chose le long des lignes de
SELECT * FROM table WHERE trim(table.date) = to_date('11.06.2009')
pour obtenir toutes les entrées pour la date, je suis à la recherche d'. Je me demandais comment je peux obtenir Hibernate pour ce faire à l'aide de requêtes HQL. Je sais que je peux utiliser des requêtes SQL en mode veille prolongée, mais cela semble être moins propre. Est-il un moyen de faire cela? Si possible, de cette façon, il devrait également travailler sur la non-oracle bases de données où timestamp serait le type de données.
source d'informationauteur Thomas Lötzer | 2009-06-11
Vous devez vous connecter pour publier un commentaire.
Vous pourriez mettre deux contraintes dans votre HQL, qui spécifie supérieur ou égal au début de la date vous êtes à la recherche sur et un qui indique moins de la prochaine journée.
c'est à dire
HQL (ainsi que SQL) permet également de:
Garder à l'esprit
between
est toujours compris, c'est à la fois>=
et<=
respectivement.Plus de détails sur
between
ici: http://www.coding-dude.com/wp/java/hibernate-java/hibernate-hql-between-expression/Je pense qu'il y a deux façons de résoudre ce problème:
Utiliser un critères requête et ajouter un SQLRestriction. La restriction prendre la forme de "trim({alias}.date) = ?". Un problème ici pourrait être la conversion du paramètre d'entrée de type correct de la part d'Oracle (ou autre SGBD). Vous pouvez fournir le nécessaire (mise en veille) type de paramètre, mais si c'est de la base de données dépendant, il sera codé en dur.
utiliser un formule dans votre hibernate mapping. La cartographie serait:
Vous pouvez maintenant utiliser Hibernate du système de typage pour utiliser une comparaison avec un objet java comme ceci:
Un problème que vous aurez avec ces deux solutions est la
trim
fonction peut ne pas être disponible dans la base de données. Une solution pour cela (par exemple, lors de tests sur HSQLDB) est à mettre à l'importation.sql sur votre chemin de classe de test (ce qui sera repris par l'Hibernation automatiquement) et de créer une procédure ou une fonction. Vous pouvez égalementAlter table Person add column birthDay timestamp
dans ce fichier afin de le rendre le schéma généré travail.Pour CustomHQLvous pouvez essayer le tronc mot-clé
Ex:
REMARQUE: Où
:LastLoginDate
est un Paramètre.Cela fait l'affaire pour moi.
vous pouvez utiliser le trunc() fonction pour supprimer le temps partiel dans la colonne DATE.
par exemple :
select * from emp where trunc(emp_date) < trunc(current_date()-30)
récupère tous les détails de l'employé qui étaient à l'emploi de 1 mois avant