3

我有一个名为 getAllEmployees() 的方法,它返回一个可分页的。

假设页面大小为 1 并从第 0 页开始

可分页可分页 = 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) 

但是当我们使用 page.nextPageable() 时,下一个将像 (1,1)

所以在下一次 fetch 时,它将选择 emp 3,而 emp 2 将被错过

4

2 回答 2

4

我有一个类似的问题。问题是您在进行迭代时要一步完成“搜索”和“删除”。因此,删除将修改搜索,但您在初始搜索中更进一步。(我认为这是主要问题)。

我的解决方案是,首先搜索所有需要删除的对象并将它们放入列表中。搜索后,删除这些对象。所以你的代码可能是这样的:

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();
 }
于 2020-05-28T10:33:28.913 回答
0

nextPageable()只有在不删除员工时才需要使用。只需添加如下条件:

if (!isDelete) { 
    pageable = page.nextPageable();
}
于 2020-05-28T10:01:10.980 回答