如何在 Hibernate 上使用多重联接?

Posted

技术标签:

【中文标题】如何在 Hibernate 上使用多重联接?【英文标题】:How to Use Multiple Join on Hibernate? 【发布时间】:2019-08-28 17:09:06 【问题描述】:

我有以下这些课程:

class Person()
   @OneToMany(mappedBy="person")
   private List<PersonRoles> roles;


class PersonRoles()
   @ManyToOne
   @JoinColumn(name = "person_id", nullable = false)
   private Person person;

   @ManyToOne
   @JoinColumn(name = "request_id")
   private Request request;


class Request()
   @OneToMany(mappedBy="request")
   private List<PersonRoles> roles;

现在我将使用休眠和内部联接根据给定的请求 ID 和他的角色获取所有人,但我的日志告诉我我的表不存在。到目前为止,这是我的查询:

sql = "SELECT p.* FROM person AS p INNER JOIN p.roles ON p.roles.personId = p.id 
INNER JOIN request AS r ON p.roles.requestId = r.id AND p.roles.role like :item 
AND r.id = :id";
query = session.createSQLQuery(sql);
query.addEntity(Person.class);
query.setParameter("item", "Members");
query.setParameter("id", id);
person = (Person) query.uniqueResult();

这是我在日志中收到的:

Table 'p.roles' doesn't exist

我忘记了一些休眠注释吗?还是我的查询有问题?

【问题讨论】:

那是因为你写了一个 SQL (native)。不使用映射。 如何将其转换为完全休眠的先生? 你必须使用实体而不是表名,这里是一个例子:baeldung.com/hibernate-named-query 我尝试过这样的事情,但它给了我一个 nullsql = "from Person as p inner join p.roles as roles inner join roles.request as request where roles.role like :item and request.id = :id"; 【参考方案1】:

简要原因

你的 SQL 语法错误

详细解释

这里是内连接example的语法

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

为multiple inner join

SELECT * 
FROM table1 
INNER JOIN table2
      ON table1.primaryKey=table2.table1Id
INNER JOIN table3
      ON table1.primaryKey=table3.table1Id

但是你使用了INNER JOIN p.roles,INNER JOIN 后面应该有一个表名,而不是列名。

这就是你出错的原因,此外,在 hibernate 中使用 HQL 而不是 SQL,这是一个很好的做法。

编码愉快!

【讨论】:

我尝试使用 HQL 但我得到了空值。 sql = "from Person as person inner join person.roles as roles inner join roles.request as request where roles.role like :item and request.id = :id" 你的语法是错误的朋友,“inner join person.roles”这是错误的 你不能加入一个列,尝试加入另一个表 即使在 HQL 中?我已经使用了 Class 而不是 table。 Person 类与 Roles 类有很多关联。 是的,hql 不是魔法,它将代码更改为 sql,所以你应该遵循 SQL 规则和要求

以上是关于如何在 Hibernate 上使用多重联接?的主要内容,如果未能解决你的问题,请参考以下文章

在 HashMap 上具有内部联接的 HQL NamedQuery

如何编写没有联接的 JPA 2.1 更新条件查询?

mySQL 多重联接,结果行为空

如何在employee_id上 进行内部联接时获取每个唯一员工的销售总额

悬停时如何在图像上添加具有多重混合模式的图层?

指纹打卡机如何与手机联接