首页 > 解决方案 > 无论如何,不​​使用 Schema 就可以查询 Vault 中的状态?

问题描述

我正在使用 Corda,以防从 Vault of Node 查询数据。基本上,我使用 Schema 为这个查询添加了一些条件。例如:

val quantityIndex = SchemaV1.Persistent::value.greaterThanOrEqual(4)

那么,有没有办法在不使用 Schema 的情况下查询 Vault 中的状态?因为我相信如果我能够使用 State 类而不是 Schema 类,我可以使用更好的条件规则查询 State。

标签: corda

解决方案


从 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."));

如果有大量状态,您必须单独过滤每个保管库页面,然后整理结果。


推荐阅读