Есть ли эффективный способ вызвать запрос для списка объектов, кроме внутри forloop - PullRequest
0 голосов
/ 26 февраля 2020

У нас есть вариант использования, в котором мы хотели сгруппировать идентификатор студента, если у нас один и тот же список книг, заимствованных разными студентами, чтобы мы могли передавать идентификаторы учеников в виде списка и вместе с идентификаторами книг в качестве запроса 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;

  }
}

Заранее спасибо

...