21

内部結合の 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();
4

3 に答える 3

34

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 結合の詳細については、14.3. Hibernate リファレンスの関連付けと結合のセクション。

于 2013-02-25T13:58:14.050 に答える
11

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;
于 2013-02-25T14:00:42.063 に答える
1

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

とはいえ、他にも問題があると思います。

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

クエリList<Orders>の構造によりSQLHQL. このモードではList<Object[]>、それぞれObject[]が選択している 4 つの列のセットである が返されます。

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

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

于 2013-02-25T15:14:47.460 に答える