我无法执行内部联接的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();
4条答案
按热度按时间gcuhipw91#
HQL中的联接的语法略有不同。
如果您已经使用HibernateMap了这些关联,则联接条件(要在哪些
id
字段上执行联接)通常由Hibernate本身(已在Map中定义了该信息)处理,因此您只需指定关联Map到哪个属性,并在其上执行联接:在尚未Map这些关联的情况下,您可能应该使用类似于交叉联接的语法,并在
WHERE
子句中指定联接条件。请注意,这可能会对效率产生负面影响,具体取决于您的架构结构和DBMS。您可以在14.3中找到有关HQL联接的更多信息。Hibernate参考的关联和联接部分。
h7appiyu2#
HQL中的连接不像在SQL中那样工作。您可以加入关联:
或使用多表选择:
这两种语法各有优缺点,因此您应该根据情况进行选择。
值得注意的是,还有一个“隐式”表示法,它可能根本不需要使用联接:
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
jum4pzuy4#
我建议使用引用关联实体。
在SQL中,您通常会将表联接在一起,以按相关实体搜索结果。在JPQL中,您可以通过在查询中将关联实体作为实体属性直接访问来引用这些实体的值。
**请注意,**Order是实体类,Products是关联列表。
然后,您可以像这样在您的方法中使用它: