2008-11-05 7 views
3

J'essaie de convertir la requête SQL ci-dessous en HQL et j'ai quelques problèmes. Une conversion ligne par ligne droite ne fonctionne pas, je me demande si je devrais utiliser une jointure interne dans le HQL?Conversion de SQL en 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 ; 

La requête retourne l'heure en secondes entre les changements d'état pour une commande client.

Les noms d'état et les dates sont insérés dynamiquement dans la requête.

Edit: juste essayé cette

"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 « doit suivre ou externe complète rejoindre par l'expression de chemin »

Répondre

6

En général, vous HQL Les jointures sont spécifiées en utilisant la propriété sur l'objet Par exemple, si les classes Foo et Bar et Foo.bar sont de type Bar, alors from Foo f inner join f.bar as b est la jointure. Pour autant que je sache, il n'y a aucun moyen d'effectuer une auto-adhésion à HQL (je peux me tromper ici). Cela dit, Hibernate vous permet d'écrire (légèrement amélioré) des requêtes SQL avec session.createSQLQuery(...).

+0

Pouvez-vous fournir un lien ou quelque chose à la syntaxe "légèrement améliorée" pour les requêtes SQL? –

0

Terminé en changeant d'utiliser SQL natif et un PreparedStatement car il semble que session.createSQLQuery() d'Hibernate ne fonctionnera que pour les entités gérées.