【问题标题】:iterator.next() returns alternate objectsiterator.next() 返回备用对象
【发布时间】:2016-07-14 05:41:31
【问题描述】:

我正在尝试在迭代器中执行 update HQL 查询以获取 java 中的多条记录。但是当我执行时,它会通过跳过下一条记录来更新备用记录。如果我只在日志中打印迭代器对象,而不执行更新查询,它会打印所有对象。那么当我在 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 来更新第 2 和第 4。

【问题讨论】:

    标签: java hibernate list iterator


    【解决方案1】:

    如果您需要在同一个循环迭代中多次访问同一个迭代器元素,则不应多次调用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();
    }
    

    【讨论】:

    • 是的,你是对的,但是我已经这样做了,只是忘记在示例代码中添加这里,我有更新代码。
    • @niraj 您的代码仍然包含两个 iter.next() 调用 - System.out.println("id: "+(Integer) iter.next());int ids = (Integer) iter.next();
    • 我的 'ids' 和你的 'currentId' 一样 :) 我保留 sys.out() 用于日志目的
    • @niraj 你不应该在 println 语句中调用iter.next()。改为打印ids
    • 是的!只需删除 sys.out() 语句,它就会插入所有记录!感谢@Eran 的帮助!顺便说一句,这只是造成问题的原因吗?
    【解决方案2】:

    请使用

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

    【讨论】:

      【解决方案3】:

      在使用Iterator 时使用while-loop 是一个好习惯。

      你应该试试:

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

      希望对你有帮助!

      【讨论】:

        猜你喜欢
        • 2019-05-22
        • 2014-10-02
        • 1970-01-01
        • 2019-02-02
        • 1970-01-01
        • 1970-01-01
        • 2018-12-30
        • 2018-07-11
        • 2021-06-30
        相关资源
        最近更新 更多