批处理10条记录java,JPA
我试图一次获取10条记录。问题是代码只获取前10条记录和最后4条记录。它跳过了介于10条记录之间的记录。 考虑到DB在表中有24条记录。以下程序应获取24条记录 SelectQuery:从对象l中选择l,其中l.processed='N' fetchObjectsCount查询:从对象对象中选择count*,其中l.processed='N'批处理10条记录java,JPA,java,jpa,batch-processing,Java,Jpa,Batch Processing,我试图一次获取10条记录。问题是代码只获取前10条记录和最后4条记录。它跳过了介于10条记录之间的记录。 考虑到DB在表中有24条记录。以下程序应获取24条记录 SelectQuery:从对象l中选择l,其中l.processed='N' fetchObjectsCount查询:从对象对象中选择count*,其中l.processed='N' private static Integer MAX_RESULT = 10; private DataExtraction object
private static Integer MAX_RESULT = 10;
private DataExtraction objectExtraction(){
int count = leadRepo.fetchObjectsCount();
Query query = null;
for (int i = 0; i < count; i++){
if (i % MAX_RESULT == 0 ){
query=entityManager.createNamedQuery("SelectQuery").setFirstResult(i).setMaxResults(MAX_RESULT);
List<Object> tempList = (List<Object>) query.getResultList();
entityManager.getTransaction().begin();
for (Object ob : tempList){
ob .setProcessed("Y");
entityManager.persist(ob );
}
entityManager.getTransaction().commit();
i = i+9;
}
if (i % MAX_RESULT < 1 && count - i <= MAX_RESULT){
query = entityManager.createNamedQuery("SelectQuery").setFirstResult(i).setMaxResults(count-i);
List<Object> tempList = (List<Object>) query.getResultList();
entityManager.getTransaction().begin();
for (Object ob : tempList){
ob .setProcessed("Y");
entityManager.persist(ob );
}
entityManager.getTransaction().commit();
}
}
return this;
}
假设您一次获取10个数据项,并且数据库中有24个数据项,那么代码将只获取所需3次中的两次 第一次迭代:检索10行,i设置为10 第二次迭代:检索10行,i设置为>10 第三次迭代:不会发生 以下是我将如何处理这件事:
int count = leadRepo.fetchObjectsCount();
int numberProcessed = 0;
Integer MAX_RESULT = 10;
query = entityManager.createNamedQuery("SelectQuery");
while(numberProcessed < count) {
query.setFirstResult(numberProcessed).setMaxResults(MAX_RESULT);
List<Object> tempList = (List<Object>) query.getResultList();
entityManager.getTransaction().begin();
for (Object ob : tempList) {
ob.setProcessed("Y");
entityManager.merge(ob);
}
entityManager.getTransaction().commit();
objectList.addAll(tempList);
numberProcessed += tempList.size();
}
此代码假定您要处理检索到的所有行。如果命名查询提取的行数与FetchObjectScont不同;这应该以不同的方式编写。我认为问题在于,您在第一次迭代中处理前十条记录,因为0%10==0,然后在循环的底部,您将I增加9。循环再次启动,将i增加到10,这再次触发记录处理循环。现在您只选择了14条未处理的记录,因为您已经更新了前10条,跳过了前10条,得到了最后4条。您可以尝试以1开始循环,看看是否得到了预期的结果。请接受我对您的代码的编辑,这是非常需要的。您的代码有太多的迭代。仍然会获取相同的14条记录并跳过介于10条记录之间的记录。。我想我无法更新获取后尝试执行的状态Y。它有多少次迭代,以及使用该命名查询实际运行的查询?还应为entityManager.merge而不是persist;是的,我建议他不要每次迭代都实例化查询。我不确定,但这似乎是一种在每次迭代中生成新查询的好方法,您在这里描述的情况会发生。我尝试用1开始我的循环,但它仍然给出相同的结果。我想知道如何获取10条记录,然后对其进行更新,然后获得接下来的10条结果。