如何在 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 我尝试过这样的事情,但它给了我一个 null:sql = "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