web-dev-qa-db-ja.com

HQLの内部結合クエリ

内部結合に対してHQLを実行できません。クエリはSQLで正しく実行されていますが、HQLでは実行されていません。どこに行けないのかわかりません。あなたの助けはかなりのものです。

 ***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

HQLの結合の構文はわずかに異なります。

これらのアソシエーションをすでにHibernateにマッピングしている場合、結合条件(結合を行うidフィールド)は通常、Hibernate自体(マッピングで既にその情報が定義されている)によって処理されます。関連付けがマップされる属性を指定し、それに対して結合を実行するだけです。

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

これらの関連付けがマップされていない場合は、おそらく構文のようなクロス結合を使用し、WHERE句で結合条件を指定する必要があります。スキーマ構造とDBMSによっては、これが効率に悪影響を及ぼす可能性があることに注意してください。

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

HQL結合の詳細については、Hibernateリファレンスの 14.3。アソシエーションと結合 セクションを参照してください。

25
Xavi López

HQLの結合は、SQLのようには機能しません。関連付けに参加できます:

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

または、複数テーブルの選択を使用します。

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

どちらの構文にも長所と短所があるため、状況に応じて選択する必要があります。

暗黙表記もあることに注意してください。これにより、結合をまったく使用する必要がなくなる場合があります。

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

orderは予約語(order byのように)であるためだと思います。代わりにFROM Orders oを試してください。

ただし、他の問題もあると思います。

選択しているもの(ランダムな列値の束)と、Hibernateが返すと期待しているもの(List<Orders>)を見てください。

クエリの構造がSQLではなくHQLモードに強制されるため、List<Orders>が返されないことを期待しています。このモードでは、List<Object[]>が返されます。各Object[]は、選択している4つの列のセットです。

このリンクでは、さまざまなクエリで何が返されるかを説明しています。

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

1
David Lavender