Как использовать оператор IN в JPQL при однонаправленном отношении ManyToMany?
Есть две сущности:
@Entity
public class Person {
@Id
Integer id;
@ManyToMany
@JoinTable(
name = "persons_addresses",
joinColumns = @JoinColumn(name = "person_id"),
inverseJoinColumns = @JoinColumn(name = "address_id")
)
Set<Address> addresses;
}
@Entity
public class Address {
@Id
Integer id;
@Column(name = "street")
String street;
}
Особенность заключается в том, что Person ссылается на Address, а Address на Person не ссылается.
Сложность возникает при составлении JPQL-запроса. Мне нужно найти адреса, которые есть у человека, и улица в которых соответствует некоторой строке. Такой JPQL-запрос вызовет ошибку:
@Query("SELECT a FROM Address a
WHERE a.street=:street
AND a IN (SELECT p.addresses FROM Person p WHERE p.id=:personId)")
Set<Address> getAllByStreetAndPersonId(String street, int personId);
Судя по логам, это происходит из-за того, что вот этот кусок кода: a IN (SELECT p.addresses интерпретируется примерно вот так: a.id IN (SELECT ..
Как я могу правильно составить запрос?
Ответы (1 шт):
Автор решения: Zhenyria
→ Ссылка
В данном случае сработает такой запрос:
SELECT a FROM Address a
WHERE a.street=:street
AND a.id IN (SELECT pa.id FROM Person p JOIN p.addresses pa WHERE p.id=:personId)