iterator.next()返回备用对象

时间:2016-07-14 05:41:31

标签: java hibernate list iterator

我正在尝试在迭代器中为java中的多个记录执行update HQL查询。但是当我执行时,它只通过跳过下一条记录来更新备用记录。如果我只在日志中打印迭代器对象,而不执行执行更新查询,则会打印所有对象。那么当我在Iterator中执行update时,它为什么每次都跳过对象?

我的代码:

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

如果myList中有4个元素,则只会通过第1个和第3个skippint更新第2个和第4个元素。

3 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分: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();
}

答案 2 :(得分: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();
}

希望它有所帮助!