【发布时间】:2020-04-26 20:03:19
【问题描述】:
他们是否存在一些处理分页以进行更新的方法? 例如我有 100 行类型:
@Id
private Integer id;
@Column
private boolean flag;
@Column
private Date last;
一开始它们看起来像:id、false、null
我有持久的方法:
@Query("SELECT t FROM Test t WHERE (t.last < :processStart OR t.last IS NULL)")
Page<Test> find(Pageable pageable, @Param("processStart") Date processStart);
我需要取 10,为每个设置 flag true 和 last = new Date() 并将其保存回 DB。
实现如下:
Date start = new Date();
for (int i = 0; i < 10; i++) {
Pageable request = new PageRequest(i, 10, SortDirectuin.ASC, "id");
Page page = testPersistence.find(request, start);
page.getContext().forEach(t -> {
..huge part of another operation..
t.setFlag(true);
t.setLast(new Date());
testPersistence.save(t);
});
}
首页上下文应该是 id: 0..9; 第二:10..19;
但在我的情况下,第二页返回 id: 20..29;
在分页结束时,我丢失了一半的数据。 返回:0..9、20..29、40..49 等。
如何预防?
【问题讨论】:
-
您正在更改数据,因此查询结果会发生变化。您正在设置一个日期,因此此时返回的结果是不同的。你突然得到了 90 个而不是 100 个结果(并得到第二页,这意味着你正在跳过第一页)。但是为什么不简单地使用更新查询一次性更新所有记录呢?
-
因为这只是一个例子,实际上我需要对另一个模型做一些操作,将标志设置为true并保存它,所以更新查询不处理我的情况。
标签: java spring pagination