【问题标题】:PageRequest and OrderBy method name IssuePageRequest 和 OrderBy 方法名称问题
【发布时间】:2020-05-20 13:21:55
【问题描述】:

在我们的 Spring 应用程序中,我们有一个包含大量“付款”记录的表。现在我们需要一个查询,将结果从总和最大到最小排序,我们面临一个错误,因为有时相同的记录包含在两个连续的页面中。

我们正在创建一个传递给存储库的 PageRequest。这里是我们的实现:

存储库:

public interface StagingPaymentEntityRepository extends JpaRepository<StagingPaymentEntity, Long>  {

Page<StagingPaymentEntity> findAllByStatusAndCreatedDateLessThanEqualAndOperationTypeOrderByEffectivePaymentDesc(String status, Timestamp batchStartTimestamp, String operationType, Pageable pageable);

}

public class BatchThreadReiteroStorni extends ThreadAbstract<StagingPaymentEntity> {
PageRequest pageRequest = PageRequest.of  (index, 170);
Page<StagingPaymentEntity> records = ((StagingPaymentEntityRepository) repository).findAllByStatusAndCreatedDateLessThanEqualAndOperationTypeOrderByEffectivePaymentDesc("REITERO", batchStartTimestamp, "STORNO", pageRequest) ;

}

其中 index 是我们请求的页面的索引。

有一种方法可以理解为什么会发生这种情况?感谢支持

【问题讨论】:

    标签: spring jpa pagination spring-data-jpa spring-data


    【解决方案1】:

    这可能有多种原因。

    1. 非确定性排序:如果您使用的排序不是确定性的,即存在可能以任何顺序排列的行,该顺序可能会在选择之间发生变化,从而导致项目被多次跳过或返回。修复:将主键作为最后一列添加到排序中。

    2. 如果您以影响排序的方式更改实体,或者其他流程这样做,您最终可能会导致项目被多次处理。

      在这种情况下,我看到了几种方法:

      1. 做基于价值的分页。 IE。不要选择页面,而是选择后面的 N 行。

      2. 使用Stream 代替分页,这允许使用单个选择但仍一次处理一个元素的结果。您可能必须刷新和驱逐实体,我不能 100% 确定这是否有效,但肯定值得一试。

      3. 最后,您可以在单独的列中标记所有要处理的行,然后选择 N 个标记的实体并在处理后取消标记。

    【讨论】:

      猜你喜欢
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 2014-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多