Playframework jpa分页每隔一页跳过一次

时间:2012-04-04 13:13:05

标签: java mysql jpa playframework

我用jpa和mysql运行playframework 1.2.4。

我有一个从DB中检索前20个活动的作业,将状态设置为活动以停止执行它们的其他作业实例,执行活动然后获取活动的下一页并重复直到所有活动完成。然而,似乎每隔一页跳过一次,或者我的页面大小为20的20条记录。我的逻辑如下。

long total = Activity.count(q, params);
int page = 1;
int pageSize = 20;

int pages = ...

while (page <= pages) {

JPAPlugin.startTx(false);
Collection<Activity> activities = Activity.find(query, params).fetch(page, pageSize);

for (Activity activity : activities) {
    activity.status = ActivityStatus.ACTIVE;
    activity.save();
}
JPAPlugin.closeTx(false);

JPAPlugin.startTx(false);
for (Activity activity : activities) 
    longProcessActivityInAnotherTransaction(activity);
JPAPlugin.closeTx(false);

page++;
}

然而,在数据库中,我看到记录1-20状态为ACTIVE,21-40没有状态ACTIVE,61-80状态为ACTIVE等等。

它似乎与交易有关。如果我在while循环中注释掉所有事务开始/关闭代码,并打印出所选活动的ID,我可以看到所有活动都被正确选择。

如果我在调试模式下运行并暂停执行mid循环,并直接对mysql数据库运行生成的查询,我会看到与代码中相同的行为。当循环没有执行时,sql查询按预期执行。

我的连接字符串是:

的MySQL://根:通过@本地/ DBNAME

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我的问题归结为我在分页查询期间如何更改活动。我选择了前20个页面,其状态为PENDING。然后在那个页面中,我会将那20个的状态设置为FINISHED。然后我会得到20 PENDING的第二页。这个后续查询obvioulsy将忽略我设置为FINISHED的前20个(id 1-20)并将id为21-40的Activities视为第1页,因此将选择第2页,即活动ID为41-60。

所以解决方法是不使用分页,但每次只将结果限制为前20个(页面大小)并在页面&lt; = pages

时循环此查询