HQL 中的内部联接查询

2022-09-02 08:54:25

我无法为内部连接执行 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映射了这些关联,则连接条件(要进行连接的字段)通常由Hibernate本身处理(它已经在映射中定义了该信息),因此您只需要指定关联映射到哪个属性,并在其上进行连接:id

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

如果尚未映射这些关联,则可能应使用类似交叉联接的语法,并在子句中指定联接条件。请注意,这可能会对效率产生负面影响,具体取决于您的架构结构和 DBMS。WHERE

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

您可以在 14.3 中找到有关 HQL 联接的更多信息。休眠引用的关联和联接部分。


答案 2

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;

推荐