Как использовать Multiple Join в Hibernate? - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть следующие классы:

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;
}

Теперь я собираюсь выбрать всех людей на основе заданного идентификатора запроса и его ролей, используя hibernate и внутреннее соединение, но мой журнал сообщает мне, что моя таблица не существует. Это мой запрос до сих пор:

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 голосов
/ 07 апреля 2019

Краткая причина

Ваш синтаксис SQL неверен

Подробное объяснение

вот синтаксис внутреннего соединения пример

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

для множественное внутреннее соединение

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 в hibernate, это хорошая практика.

счастливого кодирования!

...