corda - 无论如何,不使用 Schema 就可以查询 Vault 中的状态?
问题描述
我正在使用 Corda,以防从 Vault of Node 查询数据。基本上,我使用 Schema 为这个查询添加了一些条件。例如:
val quantityIndex = SchemaV1.Persistent::value.greaterThanOrEqual(4)
那么,有没有办法在不使用 Schema 的情况下查询 Vault 中的状态?因为我相信如果我能够使用 State 类而不是 Schema 类,我可以使用更好的条件规则查询 State。
解决方案
从 Corda 3 开始,没有办法做到这一点。这是因为除了作为模式的一部分提取的属性之外,状态只是简单地存储为 Java blob。
您必须提取状态然后在内存中过滤它们:
List<StateAndRef<ArtState>> artStateAndRefs = getServiceHub().getVaultService().queryBy(ArtState.class).getStates();
StateAndRef<ArtState> inputArtStateAndRef = artStateAndRefs
.stream().filter(artStateAndRef -> {
ArtState artState = artStateAndRef.getState().getData();
return artState.getArtist().equals(artist) && artState.getTitle().equals(title);
})
.findAny()
.orElseThrow(() -> new IllegalArgumentException("The piece of art was not found."));
如果有大量状态,您必须单独过滤每个保管库页面,然后整理结果。
推荐阅读
- java - 在 Spring Boot 中,我们如何通过命令行加载 kafka.bootstrap-servers?
- java - 在 Netty 处理程序中重用 HTTP 响应
- python - 第二次使用“反向”迭代器时的空列表
- json - 为什么我的 JSON 会创建多个条目而不是更新它们?
- powerbi - 返回所有结果的计算列
- java - Java 泛型 - 名称 ID 和 S 是什么意思?
- python - iPython locals() 中的“_oh”是什么?以及如何让本地人回来或在标准 python IDLE 中创建新的
- android - 如何清理所有 Flutter 和 Android Studio 工作区?
- c# - C# 无法查看 API 响应上的错误只是抛出一个异常来尝试/捕获
- javascript - 使用 selenium 进行数据抓取无法找到搜索结果