Как отфильтровать A, у которого есть список объектов B, используя JPA

#mysql #spring #jpql

#mysql #весна #jpql

Вопрос:

Итак, у меня есть три объекта

  1. Компания:
 class Company{
         List<City> cities;
         List<Employ> employs;
}
 
  1. Город:
 class City{
        long id;
        String name;
}
 
  1. Использовать:
 class Employ{
        long id;
        String name;
}
 

Теперь я должен отфильтровать компании, в которых работают.name = x и имеет city.name = y,

Как мне это сделать, используя чистую форму любого JPQL или MySQL, было бы хорошо,

TIA

Ответ №1:

Иерархия классов не упоминает первичные и внешние ключи, но обычно вы моделируете ее с помощью первичного company_id в company, а для отношений 1: n внешний ключ company_id на многих (n) сторонах:

 select company_id from company
where company_id not in (
  select company_id from city where name = :x
  union
  select company_id from employee where name = :y
);
 

Комментарии:

1.Он отфильтровывает записи, где employ.name = x ИЛИ city.name = y вместо И

Ответ №2:

Вот JPQL запрос

  select c from Company c  
 where 
     not exists(select 1 from c.employs emp where emp.name=:name) and 
     not exists(select 1 from c.cities city where city.name=:cityName)
 

Комментарии:

1. Это даст вам компании, но op не хотел их отфильтровывать?

2. Отредактировано @Allan WindI. Я неправильно понял вопрос

3. Я не думаю, что этот запрос вообще будет работать. Поскольку вложенные запросы не коррелированы, вы либо получаете все строки, либо вообще ничего.

4. @Allan WindI Запрос должен работать. Вложенные запросы коррелируются тем же Company c

5. Коррелированный подзапрос означает, что выражение из внешнего запроса используется для выбора элементов подзапроса. Вы перемещаетесь по иерархии данных, возможно, это правильно, но это не реляционно. Из проблемы неясно, должно ли это быть «или» или «и» между двумя запросами. Мой ответ предполагает или и ваш и.