Возвращает список пользователей

#mysql #spring-data-jpa

#mysql #spring-data-jpa

Вопрос:

У меня есть такая сущность

 {
  id,
  projectId,
  name,
  age,
  address
}
 

Теперь мне нужно вернуть список пользователей, которые подключены к проектам, в которых 4 или более пользователей
Например, если у меня есть в базе данных записи, подобные этой

 {1, 1, "John", 21, "Address1"}
{2, 1, "Joey", 22, "Address2"}
{3, 2, "Tom", 25, "Address3"}
{4, 3, "Mike", 23, "Address4"}
{5, 1, "John", 26, "Address5"}
{6, 3, "Jane", 28, "Address6"}
{7, 2, "Joe", 23, "Address7"}
{8, 2, "Steve", 24, "Address8"}
{9, 3, "Will", 29, "Address9"}
{10, 1, "Robert", 21, "Address10"}
{11, 2, "James", 20, "Address11"}
 

я должен получить возвращенный список

 {1, 1, "John", 21, "Address1"}
{2, 1, "Joey", 22, "Address2"}
{3, 2, "Tom", 25, "Address3"}
{5, 1, "John", 26, "Address5"}
{7, 2, "Joe", 23, "Address7"}
{8, 2, "Steve", 24, "Address8"}
{10, 1, "Robert", 21, "Address10"}
{11, 2, "James", 20, "Address11"}
 

потому что проект с идентификатором 1 имеет 4 пользователя, а также проект с идентификатором 2 имеет 4 пользователя, но проект с идентификатором 3 имеет 3 пользователя, и мне не нужны эти пользователи в качестве результата.

Я использую SpringData JPA, но, как я исследовал, JPA не предоставляет возможности для такой фильтрации, и в качестве другого варианта я обнаружил, что могу написать пользовательский запрос MySQL, но не знаю, как должен выглядеть этот запрос. Я пробовал что-то с group by projectId , но не знаю, как считать и получать только группы, которыеиметь 4 или более пользователей

 @Query(value = "SELECT * FROM USER u GROUP BY projectId", nativeQuery = true)
List<User> findUsers();
 

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

1. Попробуйте этот SQL-запрос. ВЫБЕРИТЕ COUNT(ProjectID), name, ProjectID ИЗ <ИМЯ_ТАБЛИЦЫ> ГРУППЫ ПО ИДЕНТИФИКАТОРУ ПРОЕКТА, ИМЕЮЩЕГО COUNT(ProjectID) >= 4

Ответ №1:

 create table temp (
  id int,
  projectId int,
  name varchar(20),
  age int,
  address varchar(20)
);


insert into temp (id,projectId,name,age,address) values (1, 1, 'John', 21, 'Address1');
insert into temp (id,projectId,name,age,address) values (2, 1, 'Joey', 22, 'Address2');
insert into temp (id,projectId,name,age,address) values (3, 2, 'Tom', 25, 'Address3');
insert into temp (id,projectId,name,age,address) values (4, 3, 'Mike', 23, 'Address4');
insert into temp (id,projectId,name,age,address) values (5, 1, 'John', 26, 'Address5');
insert into temp (id,projectId,name,age,address) values (6, 3, 'Jane', 28, 'Address6');
insert into temp (id,projectId,name,age,address)  values (7, 2, 'Joe', 23, 'Address7');
insert into temp (id,projectId,name,age,address)  values (8, 2, 'Steve', 24, 'Address8');
insert into temp (id,projectId,name,age,address) values (9, 3, 'Will', 29, 'Address9');
insert into temp (id,projectId,name,age,address) values (10, 1, 'Robert', 21, 'Address10');
insert into temp (id,projectId,name,age,address)  values (11, 2, 'James', 20, 'Address11');
 

ЗАПРОС :

 SELECT *
FROM   temp
WHERE  projectid IN (SELECT projectid
                     FROM   temp
                     GROUP  BY projectid
                     HAVING Count(*) > 3)