我正在尝试在迭代器中为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个元素。
答案 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();
}
希望它有所帮助!