112

我一直在尝试这个查询的变体,但似乎无法做到这一点。我还参考了这篇文章:加入的预期路径!Nhibernate 错误,似乎无法将相同的逻辑应用于我的查询。我的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"
)
4

3 回答 3

142
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 语句中使用从一个实体到另一个实体的路径。有关详细信息,请参阅有关 HQL 和连接的 Hibernate 文档

于 2012-05-04T12:40:28.573 回答
76

您需要命名持有与用户关联的实体。例如,

... INNER JOIN ug.user u ...

这就是错误消息所抱怨的“路径”——从用户组到用户实体的路径。

Hibernate 依赖于声明性 JOIN,其连接条件在映射元数据中声明。这就是为什么没有路径就无法构造原生 SQL 查询的原因。

于 2012-05-04T12:39:06.850 回答
0

最好使用 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 时才有效

于 2021-09-17T20:13:47.430 回答