HQL 错误:连接的预期路径
Posted
技术标签:
【中文标题】HQL 错误:连接的预期路径【英文标题】:HQL ERROR: Path expected for join 【发布时间】:2012-05-04 12:37:08 【问题描述】:我一直在尝试此查询的变体,但似乎无法实现。我还引用了这篇文章:Path Expected for Join! Nhibernate Error 并且似乎无法将相同的逻辑应用于我的查询。我的User
对象有一个UserGroup
集合。
我知道查询需要引用对象中的实体,但从我所看到的情况来看...
@NamedQuery(
name = "User.findByGroupId",
query =
"SELECT u FROM UserGroup ug " +
"INNER JOIN User u WHERE ug.group_id = :groupId ORDER BY u.lastname"
)
【问题讨论】:
【参考方案1】:select u from UserGroup ug inner join ug.user u
where ug.group_id = :groupId
order by u.lastname
作为命名查询:
@NamedQuery(
name = "User.findByGroupId",
query =
"SELECT u FROM UserGroup ug " +
"INNER JOIN ug.user u WHERE ug.group_id = :groupId ORDER BY u.lastname"
)
在 HQL 语句中使用从一个实体到另一个实体的路径。详情请见Hibernate documentation on HQL and joins。
【讨论】:
什么是“路径”?我搜索了 HQL 文档,但没有找到定义。 这意味着您需要链接实体:在上面的示例中,请注意他如何放置 ug.user u。如果没有前面的 ug,你会得到错误。另外,'ug.user u' 中的 'user' 应该是 Class UserGroup 中的字段名称! 这种 HQL 语法很烦人。我必须找到很多例子并找到你的。 那么我不能“手动”加入没有与实体声明的显式映射(用于加入的字段)的实体?【参考方案2】:您需要命名与用户关联的实体。例如,
... INNER JOIN ug.user u ...
这就是错误消息所抱怨的“路径”——从用户组到用户实体的路径。
Hibernate 依赖于声明性 JOIN,其连接条件在映射元数据中声明。这就是为什么没有路径就无法构造原生 SQL 查询的原因。
【讨论】:
终于有人回答了问题的根源...(需要在外部表前面加上现有别名)解决了我的问题,非常感谢! 如果:您没有在实体中建立关联,只是保存了类似“Long userId;”之类的内容【参考方案3】:最好使用 where 子句。 Hibernate 不接受实体之间不存在 PK/FK 关系的表的内部连接
做
SELECT s.first_name, s.surname, sd.telephone_number FROM Student s, StudentDetails sd WHERE s.id = sd.student_id
而不是
SELECT s.first_name, s.surname, sd.telephone_number FROM Student s INNER JOIN StudentDetails sd on s.id = sd.student_id
只有当学生的 id (s.id) 在 StudentDetails (sd.student_id)) 表设计/erd 上被引用为 FK 时,后者才有效
【讨论】:
以上是关于HQL 错误:连接的预期路径的主要内容,如果未能解决你的问题,请参考以下文章
JPA 查询连接错误:org.hibernate.hql.internal.ast.QuerySyntaxException:连接所需的路径
Hibernate JPQL/HQL:聚合函数的错误显示错误的表/实体连接两次(仅使用 HSQLDB)的结果?