【问题标题】:Spring PagingAndSortingRepository delete entry during processingSpring PagingAndSortingRepository 在处理过程中删除条目
【发布时间】:2020-07-23 21:34:29
【问题描述】:

我正在使用 spring PagingAndSortingRepository 对数据库条目进行分页。 在处理过程中我需要删除一些条目..

当我调用存储库删除时,该条目被删除,之后问题在于下一个可分页。我没有从下一个 Pageable (pageRequest.next();) 中获取元素的大小。

有没有办法用分页进行迭代并并行执行crud操作。

部分代码


 while (!onePage.isEmpty()) {
                while (pageIterator.hasNext()) {
                    Object nextElement = pageIterator.next();
                    if (!falseCondition) {
                        log.info("sending message with Id {}", nextElement.getId());
                        repository.deleteById(nextElement.getId());

                    } else {
                        log.info("Lost connection");
                        return;
                    }
                }

                pageRequest = pageRequest.next();
                onePage = repository.findAll(pageRequest);
                pageIterator = onePage.iterator();

            }

非常感谢。

【问题讨论】:

  • 您没有得到任何结果还是没有得到正确的结果?
  • 我没有得到正确的结果,从数据库中得到一个随机条目(分页大小为 3)
  • 该页面基于查询返回的元素数量构建,并且每次您请求下一个偏移量和页面大小时都会运行它。如果您在处理页面时删除元素,则下一页请求将更改。看下面的例子: 查询完整的结果:1、2、3、4、5、6、7、8、9、10。第一页(尺寸3):1、2、3。删除2。第二页(尺寸3 ): 5, 6, 7. 如您所见,元素 4 没有返回,因为它在删除 2 后已成为第一页的一部分。您可以保存所有要删除的元素的 id 并在整个过程中执行一次结果集已处理

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


【解决方案1】:

就像@ruba 在示例中指出的那样,这不是休眠问题。即使您直接使用 jdbc API,您也必须处理这种情况。我可以给你一个解决方案

  • 您可以实现自定义spring-data-jpa 存储库方法,其中服务传递pageRequest,但您将其转换为offsetlimit。因此,您无需调用pageRequest.next(),而是考虑到已删除的项目执行以下操作。
        long nextPageNumber = pageRequest.getPageNumber() + 1;
        long nextOffset = nextPageNumber * pageRequest.getPageSize() 
                          - itemsDeletedInCurrentPage;
        long limit = pageRequest.getPageSize();
        
        List<Item> itemsInNextPage = em.createQuery(query)
                .setFirstResult(offset)
                .setMaxResults(limit)
                .getResultList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 2014-02-04
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多