Как использовать оператор 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)
→ Ссылка