2014-10-23 3 views
1

Я пытаюсь получить 10 записей за раз. Проблема в том, что код просто извлекает первые 10 записей и последние 4 записи. Он пропускает промежуточные 10 записей.
Учитывая, что в базе данных имеется 24 записи. Следующая программа должна принести 24 записейПакетная обработка 10 записей java, JPA

SelectQuery: SELECT л из объекта л, где l.processed = 'N' fetchObjectsCount запроса: Выбор количества (*) из объекта OBJ, где 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; 

    } 
+0

Примите мое изменение своего кода, оно крайне необходимо – DreadHeadedDeveloper

ответ

0

Учитывая, что вы получаете 10 за раз, и у вас есть 24 элемента в db, этот код будет извлекать только два из 3 требуемых.

Первая итерация: возвращает 10 строк, я настроен на 10
второй итерации: возвращает 10 строк, я установлен в> 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(); 
} 

Этот код предполагает, что вы хотите обработать все полученные строки. Если ваш именованный запрос вытаскивает другое количество строк, чем fetchObjectsCount(); это должно быть написано по-разному.

+0

В вашем коде слишком много итераций. и все еще извлекает те же 14 записей и пропускает между 10 записями. –

+0

. Я думаю, что я не могу обновить статус («Y»), который я пытаюсь сделать после извлечения. –

+0

Сколько итераций есть, и какой запрос вы действительно используете с этим именованным запросом? – zmf

0

Я думаю, проблема заключается в том, что вы обрабатываете первые десять записей на первой итерации (потому что 0% 10 == 0), а затем в нижней части этого цикла вы увеличиваете i на 9. Начинаются петли снова, увеличивая i до 10, что снова вызывает цикл обработки записи. Теперь вы выбираете необработанные записи (теперь только 14, так как вы обновили первую десятку), пропустив первую десятку и получив последние четыре. Вы можете попробовать начать цикл с 1 и посмотреть, дает ли это ожидаемые результаты.

+0

Да, я посоветовал ему НЕ инстанцировать запрос на каждую итерацию. Я не уверен, но это похоже на хороший способ генерации нового запроса на каждой итерации, где то, что вы описали здесь, произойдет. – zmf

+0

Я попытался запустить свою петлю с 1, но все равно дает те же результаты. Интересно, как я могу получить 10 записей, а затем обновить их, а затем получить следующие 10 результатов. –

Смежные вопросы