#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)