在我们的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是我们正在请求的页面的索引。
有一种方法可以了解它为什么发生?感谢支持
答案 0 :(得分:0)
这可能有多种原因。
非确定性排序:如果您使用的不是确定性排序,即某些行可能以任何顺序排列,顺序在选择之间可能会改变,从而导致项目被跳过或返回多次。修复:将主键作为最后一列添加到订单中。
如果您以影响订购的方式更改实体,或者执行其他过程,则可能最终导致物品被多次处理。
在这种情况下,我看到几种方法:
基于值的分页。即不要选择页面,而是选择。之后的下N行。
不是使用分页delimiters: [9, 13, 44], // tab, enter, comma
,而是使用单个选择,但仍一次处理一个元素的结果。您可能需要刷新和逐出实体,但我不确定是否100%可行,但值得一试。
最后,您可以在单独的列中标记要处理的所有所有行,然后选择N个标记的实体,并在处理它们后将其取消标记。