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

时间:2019-04-07 11:15:37

标签: java hibernate inner-join

我有以下这些课程:

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

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

1 个答案:

答案 0 :(得分:0)

简要原因

您的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之后应该有一个表名,而不是列名。

这就是为什么会出错的原因,此外,在休眠状态下使用HQL代替SQL是一个好习惯。

编码愉快!