2013-02-25 17 views
9

内部ジョインにHQLを実行できません。クエリはSQLでは正しく実行されますが、HQLでは正しく実行されません。 私はどこに行方がわからないのですか?あなたの助けは相当なものです。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(); 

答えて

17

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 

Hibernateリファレンスの14.3. Associations and joinsセクションで、HQL結合の詳細を確認できます。

3

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; 
+0

それはまだ働いていません。 SELECT op.username、op.email、orders.p_id、受注。o_id注文からの」+ \t \t \t \t \tは "" + \t \t \t \t \t "インナーOPとしてorder.orderProcessingをJOIN" + \t \t \t \t \t "内積" + \t \tとしてorder.product結合順序"product.p_id =" + P_ID + \t \t \t \t \t \t 0 "ORDER BY op.username –

+0

文字列の連結がコードから直接取られている場合は、_where_および_order by_句の前に_from Orders order_の前後にいくつかのスペースがありません。それが問題ではない場合は、誰かが何が起こっているのかを把握する前にエラーを投稿する必要があります(可能な場合はビジネスオブジェクトのマッピング/構造) – Grim

+0

org.hibernate.hql.ast.QuerySyntaxError:予期しないトークン:1行目、60列目のオーダー[SELECT op.username、op.email、orders.p_id、orders.o_idFROMオーダーorderINNER JOIN order.orderProcessing with op INNER JOIN order.product as productWhere product.p_id = 208ORDER BY op.username] –

0

私はorderorder byのように予約語(ですので、それは疑います)。代わりにFROM Orders oを実行してください。

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

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

List<Orders>のクエリの構造によって、の代わりにSQLモードに強制的に休止状態が強制されるので、私は戻ってくることはないと思います。このモードでは、あなただけの各Object[]は、あなたが選択されているこれらの4つの列のセットですList<Object[]>が返されます。

このリンクを使用すると、別のクエリを取り戻すために何を期待できるかについて説明します。

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

+0

BY P_ID = ' "+ P_ID +"' "+ \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t" ORDER:org.hibernate.hql .ast.QuerySyntaxError:予期しないトークン:1行目、148列目のON [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として製品ON product.p_id = orders.p_idどこ生産t.p_id = '208' ORDDER BY op.username] –

関連する問題