Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
批处理10条记录java,JPA_Java_Jpa_Batch Processing - Fatal编程技术网

批处理10条记录java,JPA

批处理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

我试图一次获取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 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条结果。