PageRequest和OrderBy方法名称问题

时间:2020-05-20 13:21:55

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

在我们的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是我们正在请求的页面的索引。

有一种方法可以了解它为什么发生?感谢支持

1 个答案:

答案 0 :(得分:0)

这可能有多种原因。

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

  2. 如果您以影响订购的方式更改实体,或者执行其他过程,则可能最终导致物品被多次处理。

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

    1. 基于值的分页。即不要选择页面,而是选择。之后的下N行。

    2. 不是使用分页delimiters: [9, 13, 44], // tab, enter, comma ,而是使用单个选择,但仍一次处理一个元素的结果。您可能需要刷新和逐出实体,但我不确定是否100%可行,但值得一试。

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

相关问题