Получение и удаление объекта с помощью pageable при весенней загрузке - PullRequest
3 голосов
/ 25 мая 2020

У меня есть метод getAllEmployees (), который возвращает страницу.

Допустим, размер страницы равен 1 и начинается со страницы 0

Pageable pageable = PageRequest.of (0, 1 );

 Page<String> allEmployees = service.getAllEmployeeNames(pageable)
 while(true) {

       for(String name: allEmployees.getContent()) {

          // check whether the employee needs to be deleted or not based on certain conditions
          boolean isDelete = service.checkEmployeeToBeDeleted() 

          if (isDelete)
            EmployeeEntity entity = service.findByName(name);
            service.delete(entity);

        }

       if (!page.hasNext()) {
            break;
        }

        pageable = page.nextPageable();
 }
  • В этом сценарии все сотрудники не удаляются, только те, которые соответствуют условию, будут удалены

, поскольку размер страницы равен 1

Скажем, всего 6 сотрудников

 emp      pageable(pageNumber, pageSize)

 1        (0 ,1) 
 2        (1 ,1) 
 3        (2 ,1) 
 4        (3 ,1) 
 5        (4 ,1) 
 6        (5 ,1) 

, когда 1 будет удален, страница будет выглядеть как

2    (0 ,1) 
3    (1 ,1) 
4    (2 ,1) 
5    (3 ,1) 
6    (4 ,1) 

, но поскольку мы go с page.nextPageable (), следующий будет быть как (1,1)

Итак, при следующей выборке он выберет emp 3, а emp 2 будет пропущен

Ответы [ 2 ]

4 голосов
/ 28 мая 2020

У меня была похожая проблема. Проблема в том, что вы выполняете «поиск» и «удаление» за один шаг, пока находитесь на итерации. Таким образом, удаление изменит поиск, но вы сделаете еще один шаг вперед с первоначальным поиском. (Я думаю, что это основная проблема).

Моим решением было сначала поискать ВСЕ объекты, которые необходимо удалить, и поместить их в список. И после поиска удалите эти объекты. Таким образом, ваш код может быть примерно таким:

Page<String> allEmployees = service.getAllEmployeeNames(pageable)

List<EmployeeEntity> deleteList = new ArrayList<>();
while(true) {

   for(String name: allEmployees.getContent()) {

      // check whether the employee needs to be deleted or not based on certain conditions
      boolean isDelete = service.checkEmployeeToBeDeleted() 

      if (isDelete)
        EmployeeEntity entity = service.findByName(name);
        deleteList.add(entity);
    }

   if (!page.hasNext()) {
        // here iterate over delete list and service.delete(entity);
        break;
    }

    pageable = page.nextPageable();
 }
0 голосов
/ 28 мая 2020

Вам нужно использовать только nextPageable(), если вы не удаляете сотрудника. Просто добавьте такие условия:

if (!isDelete) { 
    pageable = page.nextPageable();
}
...