【发布时间】: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