【问题标题】:Fetch and delete the object using pageable in spring boot在 Spring Boot 中使用 pageable 获取和删除对象
【发布时间】:2020-09-12 00:00:24
【问题描述】:

我有一个名为 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 被删除时,pageable 会是这样的

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

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

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

【问题讨论】:

    标签: spring spring-boot spring-data-jpa pageable


    【解决方案1】:

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

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

    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();
     }
    

    【讨论】:

    • 谢谢。我们遇到了类似的问题,只是在我们的例子中我们的对象可能很大,所以我们使用 id 来标记List&lt;UUID&gt; deleteList,然后是repository.deleteById(uuid)
    • 也是个好主意。但据我所知,在 Java 中,我们也主要使用“引用”而不是内存中的对象。所以我不知道使用标记是否重要。
    【解决方案2】:

    您只需要在不删除员工时使用nextPageable()。只需添加这样的条件:

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

    【讨论】:

      猜你喜欢
      • 2018-10-24
      • 2017-01-10
      • 1970-01-01
      • 2020-01-19
      • 2022-01-21
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多