web-dev-qa-db-fra.com

Utiliser HQL pour interroger à une date tout en ignorant le temps sur Oracle

J'ai une table (à Oracle 9 et plus) où j'ai besoin de trouver toutes les entrées pendant une journée donnée en utilisant Hibernate. Les entrées ont des horodatages (avec le type de données 'Date'). Certaines des entrées ont un temps, d'autres n'ont qu'une date. Cela ne peut pas être changé, car il s'agit de la sortie d'autres applications que je ne peux pas changer. En SQL j'écrirais quelque chose dans le sens de

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

pour obtenir toutes les entrées pour la date que je recherche. Je me demandais comment je peux obtenir de l'hibernation pour le faire en utilisant HQL. Je sais que je peux utiliser des requêtes SQL dans Hibernate, mais cela semble être moins propre. Y a-t-il un moyen de faire cela? Si possible, de cette façon devrait également fonctionner sur des bases de données non oracle où l'horodatage serait le type de données.

16
Thomas Lötzer

Vous pouvez mettre deux contraintes dans votre HQL, une qui spécifie plus ou égale au début de la date à laquelle vous recherchez et qui spécifie moins que le lendemain.

c'est à dire.

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

HQL (ainsi que SQL) permet également:

table.date between 11.06.2009 AND 11.07.2009

Gardez à l'esprit between est toujours inclusif, ce qui signifie qu'il 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/ Englisons

15
tschaible

Je pense qu'il y a deux façons de résoudre ce problème:

  1. Utilisez A Critères Query et ajoutez A SQLRESTRENTION . La restriction prendrait la forme "Trim ({alias} .Date) =?". Un problème ici pourrait être la conversion du paramètre d'entrée sur le type correct sur Oracle (ou d'un autre SGBD). Vous pouvez fournir le type (hibernate) nécessaire en tant que paramètre, mais si la base de données dépend de la base de données, elle sera codée en papier.

  2. utilisez A formule dans votre cartographie hibernate. La cartographie serait:

    <Nom de la classe = "Personne"> 
 <nom de la propriété = "anniversaire" formule = "garniture (anniversaire)" /> [____.] </ classe>]

Vous pouvez maintenant utiliser le système de frappe d'Hibernate pour utiliser un comparateur avec A Java objet comme ceci:

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

Un problème que vous aurez avec les deux solutions est la fonction trim peut ne pas être disponible dans la base de données. Une solution pour cela (par exemple, lors de tests sur HSQLDB) consiste à mettre un import.sql sur votre test de classe de classe (ceci sera récupéré par Hibernate automatiquement) et créer une procédure ou une fonction là-bas. Vous pouvez également Alter table Person add column birthDay timestamp Dans ce fichier pour faire fonctionner le schéma généré.

2
Maarten Winkels

Pour CustomHQL, vous pouvez essayer le mot clé Trunc

Pour ex:

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

NOTE ::LastLoginDate est un paramètre.

Cela fait le tour pour moi.

2
user565390