我们有一个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 column projections
有关。查询接口返回&#39;状态列表(.getStates())&#39;或聚合结果&#39;(。getOtherResults())&#39;。我们想知道是否可以(或计划)从数据库中获取单个列,然后通过Vault接口过滤重复项,目前我们在java中这样做。
答案 0 :(得分:1)
如果您的状态为QueryableState
,则可以根据其架构属性对其进行有效查询。
例如,假设在CorDapp示例(https://github.com/corda/cordapp-example)中,我想基于它们的值以及我是否是贷方来查询IOUState
的保险库。我可以这样做:
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();
}
在您的情况下,您将根据当事人的身份证或当事人的姓名进行查询。然后,您将获取第一个结果并使用它将该方的名称映射到该方的ID,反之亦然。