web-dev-qa-db-fra.com

Inner joint la requête dans HQL

Je ne parviens pas à exécuter HQL pour les jointures internes, Query s'exécute correctement sur sql mais pas sur HQL. Je ne sais pas où je manque. Votre aide est appréciable.

 ***Error***: org.hibernate.hql.ast.QuerySyntaxError: unexpected token: ON near line 1, column 148 [SELECT op.username, op.email, orders.p_id, orders.o_id, product.listed_price FROM com.model.Orders  orders INNER JOIN orders.OrderProcessing as op ON op.u_id = orders.u_id INNER JOIN orders.Product as product ON product.p_id = orders.p_id WHERE product.p_id = '208' ORDER BY op.username]

productList = (List<Orders>) session.createQuery(
 "SELECT op.username, op.email, orders.p_id, orders.o_id, product.listed_price " +                                                                               
 "FROM Orders orders " +                                                                   
 "INNER JOIN orders.OrderProcessing as op " +                                                                                       
 "ON op.u_id = orders.u_id " +                                                         
 "INNER JOIN orders.Product as product " +                                                              
 "ON product.p_id = orders.p_id " +                                                        
 "WHERE product.p_id = '"+p_id +"' " +                                                         
 "ORDER BY op.username"
).list();
14
user1395824

Les jointures dans HQL ont une syntaxe légèrement différente.

Si vous avez déjà ces associations mappées avec Hibernate, les conditions de jointure (sur lesquelles les champs id sur lesquels effectuer la jointure) sont généralement gérées par Hibernate lui-même (qui a déjà ces informations définies dans le mappage), donc vous il suffit de spécifier avec quel attribut l'association est mappée et de faire la jointure dessus:

SELECT op.username, op.email, orders.p_id, orders.o_id, product.listed_price 
FROM Orders order
INNER JOIN order.orderProcessing as op
INNER JOIN order.product as product 
ORDER BY op.username

Dans le cas où vous n'avez pas mappé ces associations, vous devriez probablement utiliser une syntaxe de type jointure croisée et spécifier les conditions de jointure dans la clause WHERE. Veuillez noter que cela pourrait avoir un impact négatif sur l'efficacité en fonction de la structure de votre schéma et du SGBD.

SELECT op.username, op.email, orders.p_id, orders.o_id, product.listed_price
FROM Orders order, OrderProcessing op, Product product
WHERE op.u_id = order.u_id AND product.p_id = orders.p_id
ORDER BY op.username

Vous pouvez trouver plus d'informations sur les jointures HQL dans la section 14.3. Associations et jointures de la référence Hibernate.

25
Xavi López

Les jointures en HQL ne fonctionnent pas comme en SQL. Vous pouvez soit adhérer à une association:

select order_1.code, item.code, item.quantity 
 from Order order_1 inner join order_1.item item;

ou utilisez une sélection multi-table:

select order_1.code, item.code, item.quantity 
 from Order order_1, Item item where item.order=order_1;

l'une ou l'autre syntaxe présente des avantages et des inconvénients, vous devez donc choisir en fonction de la situation.

Il convient de noter qu'il existe également une notation implicite, qui pourrait rendre inutile l'utilisation de la jointure:

select item.order.code, item.code, item.quantity from Item item;
6
Grim

Je soupçonne que c'est parce que order est un mot réservé (comme dans order by). Essayez de faire FROM Orders o au lieu.

Je pense que vous aurez aussi d'autres problèmes.

Regardez ce que vous sélectionnez (un tas de valeurs de colonnes aléatoires) et ce que vous attendez d'Hibernate (List<Orders>).

J'espère que vous ne reviendrez pas List<Orders> car la structure de votre requête forcera l'hibernation en mode SQL au lieu de HQL. Dans ce mode, vous récupérerez simplement un List<Object[]> où chaque Object[] est un ensemble de ces quatre colonnes que vous sélectionnez.

Ce lien explique ce à quoi vous pouvez vous attendre avec différentes requêtes:

http://www.laliluna.de/jpa-hibernate-guide/ch11s02.html

1
David Lavender