我需要更新多个记录。我不能按条件执行批量更新查询,因为我们有一个规则,即对于每个数据库更改,我们都必须向消息代理发送消息。因此,我需要一个一个地更新实体。
我使用Spring Data Repository。我可以通过发出可分页的请求并更新页面中的元素来做到这一点。
https://www.baeldung.com/spring-data-repositories
@Service
class MyEntityService {
MyEntityRepository myEntityRepository; // extends PagingAndSortingRepository<MyEntity, ObjectId>
updateMultipleEntities(UpdateRules updateRules) {
Criteria criteria = buildCriteria(updateRules);
long totalrecords = myEntityRepository.count(criteria);
long totalUpdateCound = 0;
// LET US ASSUME THAT NUMBER OF RECORDS DOES NOT CHANGE
while (totalUpdateCound < totalrecords) {
Page page = myEntityRepository.findAll(buildPageble(totalUpdateCound, criteria));
processElementsFromPage(page);
}
}
}
另一种解决方案是流式传输所有元素并对其进行更新。看起来更容易。
@Service
class MyEntityService {
MyEntityRepository myEntityRepository; // extends CrudRepository<MyEntity, ObjectId>
updateMultipleEntities(UpdateRules updateRules) {
Criteria criteria = buildCriteria(updateRules);
// LET US ASSUME THAT NUMBER OF RECORDS DOES NOT CHANGE
myEntityRepository.streamAll(criteria).forEach(element -> processElement(element, updateRules));
}
}
使用streamAll(criteria)
的解决方案是否有缺点?据我了解,如果需要在UI上进行分页,则使用可分页的请求会很有用。但是,如果我需要一个一个地处理元素的情况呢?
示例为什么流式传输结果可以提高性能。但是,它仅显示只读情况。