hibernate HQL中的内部联接查询

wmtdaxz3  于 2022-11-14  发布在  其他
关注(0)|答案(4)|浏览(200)

我无法执行内部联接的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();
gcuhipw9

gcuhipw91#

HQL中的联接的语法略有不同。
如果您已经使用HibernateMap了这些关联,则联接条件(要在哪些id字段上执行联接)通常由Hibernate本身(已在Map中定义了该信息)处理,因此您只需指定关联Map到哪个属性,并在其上执行联接:

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

在尚未Map这些关联的情况下,您可能应该使用类似于交叉联接的语法,并在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

您可以在14.3中找到有关HQL联接的更多信息。Hibernate参考的关联和联接部分。

h7appiyu

h7appiyu2#

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;
vhipe2zx

vhipe2zx3#

我怀疑这是因为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

jum4pzuy

jum4pzuy4#

我建议使用引用关联实体
在SQL中,您通常会将表联接在一起,以按相关实体搜索结果。在JPQL中,您可以通过在查询中将关联实体作为实体属性直接访问来引用这些实体的值。

private static final String FIND_ORDERS_WITH_PRODUCTS =
       "from Order o " +
       "where :product member of o.products";

**请注意,**Order是实体类,Products是关联列表。

然后,您可以像这样在您的方法中使用它:

List<Order> findOrders(Outfit o){
   TypedQuery<Order> query = entityManager.createQuery(FIND_ORDERS_WITH_PRODUCTS, Order.class);
   query.setParameter("outfit", o);
   return query.getResultList();
}

相关问题