【问题标题】:Hibernate: Iterating batch of objects and updating the sameHibernate:迭代一批对象并更新它们
【发布时间】:2014-09-11 12:57:30
【问题描述】:

我想批量迭代实体列表,并想更新同一实体中的特定字段。我尝试使用的逻辑如下:

private void process()
{
    int index = 0;
    boolean hasMore = true

    while (hasMore)
    {
            List<Model> models = DAO.getModels(index, batchSize); // batchSize is configurable
             if (models != null && models.size() == 0)
             {
                    System.out.println("found zero   ");
                    hasMore = false;
                    break;
             }

             processModels(models);
             index = index + batchSize;
    }
}

get models 方法有一个 HQL 查询,如下所示:

String hqlQuery = "from Model ac where ac.syncflag ='N'"

processModels() 方法处理这些模型对象并根据一些逻辑将同步标志值设置为“Y”。

processModel() 方法如下所示:

private void processModel()
{
if (models != null && models.size() > 0)
        {
            for (Model model : models)
            {
                this.updateFlagForModel(model);

            }
            }
        }

}

private void updateFlagForModel(Model model)
{
  // some processing........
    model.setFlag(true);
    DAO.saveOrUpdate(model);
}

但是,当我迭代和更新相同的对象时,批处理逻辑受到干扰,我无法处理正确数量的记录。

有人可以帮忙吗?我需要在查询部分添加一些额外的逻辑来处理这个吗?

问候

【问题讨论】:

  • '无法处理正确数量的记录' - 我们怎么知道你的意思?请提供详细而准确的问题描述。
  • 顺便说一句,您不使用批量更新是否有原因?
  • 迭代逻辑中断,无法正确处理。假设我总共有 9 条记录要处理。当我不进行实际更新并通过放置一些记录器语句来验证逻辑时,我可以看到所有 9 条记录可供处理。但是,与实际更新操作相同的逻辑正在中断,并且所有记录都没有得到处理。甚至 System.out 语句 (System.out.println("found zero");) 也没有被打印出来。
  • 请让我重申一下,看看我是否正确 - 直接在 DAO.getModels 之后,您确实有您期望的记录。在processModel 方法中,集合以某种方式被破坏了。如果这是正确的,请将processModel 源添加到您的问题中 - 您发布的代码不会操纵列表。
  • 用更多细节编辑了问题

标签: hibernate pagination insert-update


【解决方案1】:

假设你有从 min(id):1 到 max(id):10000 的区间,syncflag ='N'。让我们决定每个选择大小为 50。所以第一页将如下所示

select ac from Model ac where ac.syncflag ='N' and id&gt;=1 and id &lt; 51(您继续处理这些记录) 下次做如下查询

select ac from Model ac where ac.syncflag ='N' and id>=51 and id < 101

然后它会一直持续到

select ac from Model ac where ac.syncflag ='N' and id>=9951 and id < 10001

如果最后有更多记录,您可以再次进行新的批量迭代,直到结束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多