[英]How to mimic List<Optional<T>> like behaviour in Spring Data Repo?
我正在尝试使用list of Id's
query
数据库,如果它们不存在,请用它们做一些事情。
我的计划是做类似的事情
List<Optional<MyObject>> fingById(Set<String> myIds);
我明白这不会开箱即用,因为我认为即使所有的id都存在也无法保证我们会被订购,所以如果它们中的一些存在,我会得到一些随机的null选项,我不会能够返回它的Id。
基本上我最终需要做的是检索这些对象,更新一个字段或使用默认值创建它们(如果不存在)。
这是批量执行此操作的最佳方式?
谢谢 :)
您可以按照其ID将结果映射到Map<String, Optional<MyObject>>
,然后使用Optional.empty()
填充空白。
List<MyObject> findByIdIn(Set<String> ids);
default Map<String, Optional<MyObject>> mapByIdIn(Set<String> ids) {
Map<String, Optional<MyObject>> found = findByIdIn(ids)
.stream()
.collect(Collectors.toMap(MyObject::getId, Optional::of));
ids.stream()
.filter(id -> !found.containsKey(id))
.forEach(id -> found.put(id, Optional.empty()));
return found;
}
我不认为使用List
of Optional
值是个好主意。 相反,我建议只使用存储库的默认方法并查询所有现有实体。
List<MyObject> findAll();
之后,您可以遍历所有对象并检查缺少的ID。 为了提高性能,我建议使用Map
:
var objectMap = repository.findAll().stream()
.collect(Collectors.toMap(MyObject::getId, Function::Identity);
然后,您只需检查地图中是否包含任何ID:
myIds.stream().filter(objectMap::contains)
.forEach({
// do some stuff, present id
});
myIds.stream().filter((id) -> !myMap.contains(id))
.forEach({
// do some stuff, not present id
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.