2016-07-14 2 views
2

Я пытаюсь выполнить updateHQL запрос внутри итератора для нескольких записей в java. Но когда я выполняю, он обновляет только альтернативную запись, пропуская следующую запись. Если я просто напечатаю объекты итератора в журнале, без выполнения запроса на обновление, он будет распечатывать все объекты. Итак, почему он пропускает объект каждый следующий, когда я выполняю update внутри Iterator?iterator.next() возвращает альтернативные объекты

Мой код:

List<Integer> id = (List<Integer>) myList.list();//I've to update query for each id 

for(Iterator <Integer> iter = id.iterator();iter.hasNext();){ 
      System.out.println("id: "+(Integer) iter.next()); 
      int ids = (Integer) iter.next(); 
      Query query =session.createQuery("update MyTable set url =? where id=?); 
      query.setParameter(0,url); 
      query.setParameter(1,ids); 
      query.executeUpdate(); 
    } 

Если у меня есть 4 элемента в myList будет просто обновить для 2-го и 4-го по skippint 1 и 3.

ответ

3

Если вам нужен доступ к одному элементу итератор несколько раз в одной и той же итерации цикла, вы не должны вызывать iter.next() несколько раз, так как каждый вызов перемещает итератор. Вместо этого вызовите iter.next() один раз и сохранить результат в переменной:

for(Iterator<Integer> iter = id.iterator(); iter.hasNext();) { 
    Integer currentID = iter.next(); 
    System.out.println("id: "+ currentID); 
    Query query = session.createQuery("update MyTable set url =? where id=?); 
    query.setParameter(0,url); 
    query.setParameter(1,currentID); 
    query.executeUpdate(); 
} 
+0

Да Вы правы, но я уже сделал этот путь, просто забыл добавить здесь в пример код, у меня есть код обновления. – Niraj

+1

@niraj Ваш код по-прежнему содержит два 'iter.next()' calls - 'System.out.println (" id: "+ (Integer) iter.next());' и 'int ids = (Integer) iter. next(); ' – Eran

+0

my 'ids' такой же, как ваш 'currentId' :) ans Я сохранил sys.out() для цели журнала – Niraj

1

используйте

List<Integer> ids = (List<Integer>) myList.list(); 
for (Integer id : ids) { 
    Query query =session.createQuery("update MyTable set url =? where id=?); 
    query.setParameter(0, url); 
    query.setParameter(1, id); 
    query.executeUpdate(); 
} 
1

Сво хорошая практика, чтобы использовать while-loop при использовании Iterator.

Вы должны попробовать:

List<Integer> ids = (List<Integer>) myList.list(); 
Iterator<Integer> iterator = ids.iterator(); 
while (iterator.hasNext()){ 
    Integer id = iterator.next(); 
    System.out.println("id in this iteration is : "+ id); 
    Query query = session.createQuery("update MyTable set url =? where id=?); 
    query.setParameter(0,url); 
    query.setParameter(1,id); 
    query.executeUpdate(); 
} 

Надеется, что это помогает!