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 错误:连接的预期路径的主要内容,如果未能解决你的问题,请参考以下文章

休眠 HQL 连接错误

JPA 查询连接错误:org.hibernate.hql.internal.ast.QuerySyntaxException:连接所需的路径

连接所需的 HQL 路径(连接同一个表时)

Hibernate JPQL/HQL:聚合函数的错误显示错误的表/实体连接两次(仅使用 HSQLDB)的结果?

HQL 错误:with 子句引用了两个不同的 from 子句元素

带有外连接的休眠 HQL 查询