Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Corda中创建自定义查询的可能方法_Corda - Fatal编程技术网

在Corda中创建自定义查询的可能方法

在Corda中创建自定义查询的可能方法,corda,Corda,我们有一个queryablestate,用于在系统初始化时存储一些信息,这些状态只发出一次,从不使用 class DataState implements LinearState, QueryableState { Party partyA; Party partyB; String partyAId; String partyBId; String sharedIdentifierNumber; DataState(Party partyA,

我们有一个queryablestate,用于在系统初始化时存储一些信息,这些状态只发出一次,从不使用

class DataState implements LinearState, QueryableState {

    Party partyA;
    Party partyB;
    String partyAId;
    String partyBId;
    String sharedIdentifierNumber;

    DataState(Party partyA, Party partyB, String partyAId, String partyBId, String sharedIdentifierNumber) {
        this.partyA = partyA;
        this.partyB = partyB;
        this.partyAId = partyAId;
        this.partyBId = partyBId;
        this.sharedIdentifierNumber = sharedIdentifierNumber;
    }
}
partyA和partyAId必须与实体A相关(partyB相同) 以下是一些示例:

new DataState(party1, party2, "00001", "12345", "0001")
new DataState(party3, party1, "05432", "00001", "0022")
new DataState(party2, party1, "12345", "00001", "0123")
我们希望有像地图一样工作的方法:

String retrievePartyId(Party party){}
assertTrue(retrievePartyId(party1).equals("00001"))
Party retrieveParty(String partyId){}
assertTrue(retrieveParty("12345").equals(party2))
我们已经通过使用自定义字段条件查询所有状态并通过在

List<StateAndRef<DataState>> 
列表

我们想知道是否有一些有效的方法可以做到这一点,也许可以使用Corda中的一些自定义查询标准。我们认为这与
sql列投影相关。查询接口返回“状态(.getStates())或聚合结果”(.getOtherResults())的列表。我们想知道是否有可能(或计划)从数据库中获取一个列,然后通过vault界面过滤重复项,目前我们正在使用java进行过滤。

如果您的状态是
QueryableState
s,则可以根据模式的属性高效地查询它们

例如,假设在CorDapp示例()中,我想根据它们的值以及我是否是出借人来查询vault中的
ioState
s。我可以这样做:

try {
    Field value = IOUSchemaV1.PersistentIOU.class.getDeclaredField("value");
    Field lender = IOUSchemaV1.PersistentIOU.class.getDeclaredField("lender");

    QueryCriteria valueOver50Criteria = new QueryCriteria.VaultCustomQueryCriteria(greaterThan(value, 50));
    QueryCriteria lenderIsMeCriteria = new QueryCriteria.VaultCustomQueryCriteria(equal(lender, getOurIdentity().getName().toString()));
    QueryCriteria criteria = valueOver50Criteria.and(lenderIsMeCriteria);

    Vault.Page<IOUState> results = getServiceHub().getVaultService().queryBy(IOUState.class, criteria);
    List<StateAndRef<IOUState>> matchingStates = results.getStates();

} catch (NoSuchFieldException e) {
    e.printStackTrace();
}
试试看{
字段值=ioicemav1.PersistentIOU.class.getDeclaredField(“值”);
字段贷方=IOUSchemaV1.PersistentIOU.class.getDeclaredField(“贷方”);
QueryCriteria valueOver50Criteria=新的QueryCriteria.VaultCustomQueryCriteria(大于(值,50));
QueryCriteria lenderIsMeCriteria=新的QueryCriteria.VaultCustomQueryCriteria(相等(贷方,getOurIdentity().getName().toString());
QueryCriteria criteria=值超过50个criteria.和(lenderIsMeCriteria);
Vault.Page results=getServiceHub().getVaultService().queryBy(iostate.class,条件);
List matchingStates=results.getStates();
}捕获(无此字段例外){
e、 printStackTrace();
}

在您的情况下,您将根据参与方的ID或参与方的名称进行查询。然后,您将获取第一个结果,并使用它将参与方的名称映射到参与方的ID,反之亦然。

如果您的状态是
QueryableState
s,则可以根据模式的属性高效地查询它们

例如,假设在CorDapp示例()中,我想根据它们的值以及我是否是出借人来查询vault中的
ioState
s。我可以这样做:

try {
    Field value = IOUSchemaV1.PersistentIOU.class.getDeclaredField("value");
    Field lender = IOUSchemaV1.PersistentIOU.class.getDeclaredField("lender");

    QueryCriteria valueOver50Criteria = new QueryCriteria.VaultCustomQueryCriteria(greaterThan(value, 50));
    QueryCriteria lenderIsMeCriteria = new QueryCriteria.VaultCustomQueryCriteria(equal(lender, getOurIdentity().getName().toString()));
    QueryCriteria criteria = valueOver50Criteria.and(lenderIsMeCriteria);

    Vault.Page<IOUState> results = getServiceHub().getVaultService().queryBy(IOUState.class, criteria);
    List<StateAndRef<IOUState>> matchingStates = results.getStates();

} catch (NoSuchFieldException e) {
    e.printStackTrace();
}
试试看{
字段值=ioicemav1.PersistentIOU.class.getDeclaredField(“值”);
字段贷方=IOUSchemaV1.PersistentIOU.class.getDeclaredField(“贷方”);
QueryCriteria valueOver50Criteria=新的QueryCriteria.VaultCustomQueryCriteria(大于(值,50));
QueryCriteria lenderIsMeCriteria=新的QueryCriteria.VaultCustomQueryCriteria(相等(贷方,getOurIdentity().getName().toString());
QueryCriteria criteria=值超过50个criteria.和(lenderIsMeCriteria);
Vault.Page results=getServiceHub().getVaultService().queryBy(iostate.class,条件);
List matchingStates=results.getStates();
}捕获(无此字段例外){
e、 printStackTrace();
}
在您的情况下,您将根据参与方的ID或参与方的名称进行查询。然后,您将获取第一个结果,并使用它将参与方的名称映射到参与方的ID,反之亦然