我无法为内部联接执行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();
答案 0 :(得分:23)
加入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连接的更多信息。
答案 1 :(得分:5)
加入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;
答案 2 :(得分:1)
我怀疑这是因为order
是保留字(如order by
中所示)。请尝试改为FROM Orders o
。
我认为你也会遇到其他问题。
看看你正在选择什么(一堆随机列值),以及你期望Hibernate返回给你的是什么(List<Orders>
)。
我希望您不会回复List<Orders>
,因为您的查询结构会强制hibernate进入SQL
模式而不是HQL
。在此模式下,您只需返回List<Object[]>
,其中每个Object[]
都是您正在选择的四列中的一组。
此链接说明了您可以通过不同查询获得的内容: