HQL中的内部联接查询

问题描述 投票:13回答:3

我无法为内部联接执行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();
java sql hibernate hql
3个回答
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连接的更多信息。


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;

1
投票

我怀疑这是因为order是一个保留字(如order by)。尝试做FROM Orders o而不是。

我想你也会遇到其他问题。

看看你在选择什么(一堆随机列值),以及你期望Hibernate返回你的东西(List<Orders>)。

我希望你不会回来List<Orders>,因为你的查询结构会强制hibernate进入SQL模式而不是HQL。在这种模式下,你只需要回到List<Object[]>,其中每个Object[]都是你选择的那四列的集合。

此链接说明了您可以通过不同查询获得的内容:

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

© www.soinside.com 2019 - 2024. All rights reserved.