La conversion SQL, HQL
Je suis en train de convertir le sous SQL requête HQL et je rencontre quelques problèmes. Droite, ligne par ligne, la conversion ne fonctionne pas, je me demande si je devrais être à l'aide d'une Jointure Interne dans le HQL?
SELECT (UNIX_TIMESTAMP(cosc1.change_date) - UNIX_TIMESTAMP(cosc2.change_date))
FROM customer_order_state_change cosc1
LEFT JOIN customer_order_state cos1_new on cosc1.new_state_id = cos1_new.customer_order_state_id
LEFT JOIN customer_order_state cos1_old on cosc1.old_state_id = cos1_old.customer_order_state_id
LEFT JOIN customer_order_state_change cosc2 on cosc2.customer_order_id = cosc1.customer_order_id
LEFT JOIN customer_order_state cos2_new on cosc2.new_state_id = cos2_new.customer_order_state_id
LEFT JOIN customer_order_state cos2_old on cosc2.old_state_id = cos2_old.customer_order_state_id
WHERE cos1_new.name = "state1" AND cos2_new.name = "state2" and cosc2.change_date < "2008-11-06 09:00"
AND cosc2.change_date > "2008-11-06 06:00" GROUP BY cosc1.change_date, cosc2.change_date ;
Requête retourne de temps en secondes entre les changements d'état d'une commande client.
L'état des noms et des dates sont insérés dynamiquement dans la requête.
Edit:
Juste essayé ce
"SELECT (UNIX_TIMESTAMP(cosc1.changeDate) - UNIX_TIMESTAMP(cosc2.changeDate))" +
" FROM" +
" " + CustomerOrderStateChange.class.getName() + " as cosc1" +
" INNER JOIN " + CustomerOrderStateChange.class.getName() + " as cosc2" +
" WHERE cosc1.newState.name = ?" +
" AND cosc1.order.id = cosc2.order.id" +
" AND cosc2.newState.name = ?" +
" AND cosc2.changeDate < ?" +
" AND cosc2.changeDate > ?" +
" GROUP BY cosc1.changeDate, cosc2.changeDate";
et reçu exception"externe ou full join doit être suivie par une expression de chemin"
OriginalL'auteur Feet | 2008-11-05
Vous devez vous connecter pour publier un commentaire.
Généralement vous HQL jointures sont spécifiées à l'aide de la propriété sur l'objet, par exemple, si la classe Foo et Bar et Foo.bar est de type Barre, puis
from Foo f inner join f.bar as b
est la jointure. Autant que je sache, il n'y a aucune façon de procéder à une auto-jointure dans HQL (je peux me tromper ici).Cela dit, Hibernate permet d'écrire (un peu) les requêtes SQL avec
session.createSQLQuery(...)
.OriginalL'auteur Nick
Fini par changer d'utiliser SQL natif et un PreparedStatement car il semble que Hibernate session.createSQLQuery() ne fonctionne que pour les Entités Gérées.
OriginalL'auteur Feet