Как выполнить собственный запрос WHERE IN с помощью поля «многие ко многим»? - PullRequest
0 голосов
/ 28 марта 2020

ОЖИДАЕМЫЙ

Один нативный запрос для получения всех питомцев определенного смотрителя с помощью поля Many to Many.

Я знаю, что могу просто получить список питомцев из Ответственный за сущность, дело в том, что я собираюсь применить и другие фильтры, используя ключевое слово AND, поэтому мне нужно, чтобы WHERE IN работал с самого начала.

КРАТКИЙ ОБРАЗЕЦ

public class Caretaker {

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "caretaker_pet",
        joinColumns = @JoinColumn(name = "caretaker_id"),
        inverseJoinColumns = @JoinColumn(name = "pet_id"))
    private List<Pet> pets;
}

public class Pet {

    @ManyToMany // skipped for clarity
    private List<Caretaker> caretakers;
}

ПРОБЛЕМА

Выдает следующий собственный запрос:

java.sql.SQLException: unknown escape sequence {non-qualified-property-ref} org.hibernate.exception.GenericJDBCException: could not prepare statement

public List<Pet> getPetsBy(Caretaker caretaker) {
    try {
        Query query = entityManager.createQuery(
                    "FROM Pet WHERE :caretaker IN (caretakers)")
                    .setParameter("caretaker", caretaker);

        return query.getResultList();
    }
    catch (Exception exception) {
        exception.printStackTrace();
    }
}

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

Вы должны попробовать JPQL запрос, подобный этому

select distinct p 
from Pet p join fetch p.caretakers caretaker
where caretaker=:caretaker

Возвращает pet с выбранными caretakers. Если вам не нужно загружать caretakers - можно использовать member of (см. Другой ответ)

0 голосов
/ 28 марта 2020

Вы можете использовать ключевое слово member of для express it:

public List<Pet> getPetsBy(Caretaker caretaker) {
    try {
        Query query = entityManager.createQuery(
                    "SELECT p FROM Pet p WHERE :caretaker member of p.caretakers")
                    .setParameter("caretaker", caretaker);

        return query.getResultList();
    }
    catch (Exception exception) {
        exception.printStackTrace();
    }
}
...