简体   繁体   中英

iterator.next() returns alternate objects

I am trying to execute update HQL query inside iterator for multiple records in java. But when I execute, it updates only alternate record by skipping next record. If I will just print iterator objects in log, without execute update query,it prints all objects. So why it's skipping object each next, when I am executing update inside Iterator?

My Code:

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();
    }

If I have 4 elements in myList it will just update for 2nd and 4th by skippint 1st and 3rd.

If you need to access the same iterator element multiple times in the same loop iteration, you shouldn't call iter.next() multiple times, since each call advances the iterator. Instead, call iter.next() once and store the result in a variable :

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();
}

please use

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();
}

Its a good practice to use while-loop when using Iterator .

You should try:

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();
}

Hope it helps!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM