У нас есть вариант использования, в котором мы хотели сгруппировать идентификатор студента, если у нас один и тот же список книг, заимствованных разными студентами, чтобы мы могли передавать идентификаторы учеников в виде списка и вместе с идентификаторами книг в качестве запроса 1. Вместо того, чтобы выполнять запрос дважды в качестве запроса 2 , и я не хочу вызывать сервисный метод для выполнения запроса в l oop
запросе 1: [studentId1, StudentId2] и [Book1, Book2]
запрос 2: например studentId1 --Book1, Book2 StudentId2-- Book1, Book2
Модель
public class School {
private String studentId;
private List<String> bookIds;
}
public class StudentResponse {
private String StudentId;
private String totalBookCount;
private String averageBookCount
}
Контроллер
public class SchoolControler {
@Value("${features.enable.query.groupByStudentBook:false}")
private boolean IsgroupStudentByBook;
@RequestMapping(value = "/students", method = POST, consumes = "application/json", produces = "application/json")
public Results < StudentResponse > getAggregatedStudentByBook(
@ApiParam("Get Total and Average of Book count") @RequestBody List < AggregateStudentBook > aggregateStudentBookRequest) {
if (IsgroupStudentByBook) {
return groupingStudentId(aggregateStudentBookRequest);
} else {
Collection < StudentResponse > AggregateStudentBookResponse = new ArrayList < > ();
for (AggregateStudentBook aggregateStudentBookRequest: aggregateStudentBookRequest) {
AggregateStudentBookResponse.addAll(StudentService.getAggregateStudentBook(aggregateStudentBookRequest.getBookIds, new ArrayList < > (Arrays.asList(aggregateStudentBookRequest.getStudentId())), false));
}
return new Results < > (AggregateStudentBookResponse);
}
private Results < StudentResponse > groupingStudentId(List < AggregateStudentBookRequest > aggregateStudentBookRequest) {
Collection < StudentResponse > aggregateStudentResponse = new ArrayList < > ();
List < String > studentIds = new ArrayList < > ();;
for (int i = 0; i <= aggregateStudentBookRequest.size() - 1; i++) {
if (studentIds.contains(aggregateStudentBookRequest.get(i).getstudentId())) {
continue;
}
List < String > commonstudentIds = new ArrayList < > ();
for (int j = 1; j < aggregatedStudentRequest.size(); j++) {
if (studentIds.contains(aggregatedStudentRequest.get(j).getstudentId())) {
continue;
}
if (i == j) {
aggregatedstudentResponse.addAll(StudentService.getAggregatedstudentBook(aggregatedStudentRequest.get(i).getBookIds(), new ArrayList < > (Arrays.asList(aggregatedStudentRequest.get(i).getstudentId())), false));
break;
}
Collections.sort(aggregatedStudentRequest.get(i).getBookIds());
Collections.sort(aggregatedStudentRequest.get(j).getBookIds());
if (aggregatedStudentRequest.get(i).getBookIds().containsAll(aggregatedStudentRequest.get(j).getBookIds())) {
commonstudentIds.add(aggregatedStudentRequest.get(j).getstudentId());
commonstudentIds.add(aggregatedStudentRequest.get(i).getstudentId());
studentIds.add(aggregatedStudentRequest.get(j).getstudentId());
studentIds.add(aggregatedStudentRequest.get(i).getstudentId());
}
}
if (!commonstudentIds.isEmpty()) {
aggregatedstudentResponse.addAll(StudentService.getAggregatedstudentBook(aggregatedStudentRequest.get(i).getBookIds(), commonstudentIds, false));
}
if (studentIds.size() == aggregatedStudentRequest.size()) {
Results < AggregatedstudentResponse > result = new Results < > (aggregatedstudentResponse);
return result;
}
}
return new Results < > (aggregatedstudentResponse);
}
}
}
Сервис
public class StudentService {
@Autowire
StudentRepository studentRepository;
public Collection < AggregateStudentBook > getAggregateStudentBook(List < String > bookIds, List < String > studentIds) {
Collection < AggregateStudentBook > aggregateStudentBook = studentRepository.fetchAggregatedStoreTargetInventory(bookIds, studentIds);
return aggregateStudentBook;
}
}
Заранее спасибо