内部結合の 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();
ベストアンサー1
HQL での結合の構文は少し異なります。
すでに Hibernate で関連付けをマッピングしている場合は、結合条件 (どのid
フィールドで結合するか) は通常、Hibernate 自体 (マッピングでその情報がすでに定義されている) によって処理されるため、関連付けをマッピングする属性を指定して、その属性で結合するだけで済みます。
SELECT op.username, op.email, orders.p_id, orders.o_id, product.listed_price
FROM Orders orders
INNER JOIN orders.orderProcessing as op
INNER JOIN orders.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 orders, OrderProcessing op, Product product
WHERE op.u_id = orders.u_id AND product.p_id = orders.p_id
ORDER BY op.username
HQL結合の詳細については、14.3. 関連と結合Hibernate リファレンスのセクション。