【问题标题】:Hyperledger Fabric Java rich query on an assetHyperledger Fabric Java 对资产的丰富查询
【发布时间】:2021-09-20 10:36:58
【问题描述】:

我需要有关超级账本结构中的 getQueryResult() 函数的帮助。 我知道我可以这样使用它:

    String queryHash;
QueryResultsIterator<KeyValue> results = stub.getQueryResult("{\"selector\":{\"hash\":\"" + queryHash + "\"}}");

运行查询,在每个资产中搜索散列参数设置为 queryHash 字符串的资产。 但是,目前我有 3 种不同类型的资产,我想了解如何仅对其中一种进行搜索。

让我解释一下。让我们假设我有 3 种不同类型的资产。例如,资产称为汽车,具有属性(id、名称、型号等),资产称为卡车,也具有属性,另一个资产称为飞机,也具有属性。 假设我要进行查询,按品牌搜索所有汽车,但不包括卡车和飞机。 如何在查询中表明我仅指该类型的资产?

谢谢

【问题讨论】:

    标签: java hyperledger-fabric hyperledger-chaincode


    【解决方案1】:

    为什么要查询单个对象?

    我不知道你的链码模型,但假设你有某种 ID,它会是这样的:

    String id;
    String queryHash;
    // ...
    QueryResultsIterator<KeyValue> results = stub.getQueryResult("{\"selector\":{\"id\":\"" + id + "\"" + ", " + "\"hash\":\"" + queryHash + "\" }}");
    

    如果您有权访问其 CouchDB 键,则可以简单地获取对象并在反序列化时检查哈希:

    String couchdbKey;
    // ...
    byte[] ba = stub.getState​(couchdbKey);
    // Deserialize ba and check hash
    

    编辑

    我认为你应该重构你的模型。我通常在 Go 中开发链代码,但在 Java 中可能类似于(检查代码,它是动态编写的):

    
    public abstract class Asset {
    
        @Property()
        private String doctype;
    
        @Property()
        private String id;
    
        protected Asset(String doctype) {
            this.doctype = doctype;
        }
    
        public String getDoctype() {
            return doctype;
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        // ...
    }
    
    @DataType()
    public class Car extends Asset {
        public static final String DOCTYPE = "car";
    
        public Car() {
            super(Car.DOCTYPE);
        }
    
        // ...
    }
    
    

    然后,您可以在 doctype 上查询每个模型。您最好为doctype 创建一个索引。

    【讨论】:

    • 我一定是误会了。我有 3 种不同类型的资产。例如,资产称为汽车,具有属性(id、名称、型号等),资产称为卡车,也具有属性,另一个资产称为飞机,也具有属性。假设我要进行查询,按品牌搜索所有汽车,但不包括卡车和飞机。如何在查询中表明我仅指该类型的资产?
    • 然后,以我的第一个示例为例,将“id”替换为“docType”或类似的东西。如果您管理不同的模型,您应该在所有模型中(例如在抽象父类中)都有这种字段。您还应该为该字段定义一个 CouchDB 索引,因为它通常用于查询。
    • 看看我的编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多