在 corda 中检索特定状态
Retrieving a specific state in corda
在我的 Corda 项目中,我需要根据状态的某些特定字段检索特定状态 class,我为每个状态设置了 Unique。如何在 Corda 中做到这一点? state的实现如下:
@BelongsToContract(OfferContract.class)
public class OfferState implements LinearState {
private final UniqueIdentifier linearID;
private AnonymousParty sender;
private AnonymousParty receiver;
private final String policyID;
private final double faceValue;
private double offeredAmount;
private boolean isActive;
public OfferState(UniqueIdentifier linearID, AnonymousParty sender, AnonymousParty receiver, String policyID, double faceValue, double offeredAmount, boolean isActive) {
this.linearID = linearID;
this.sender = sender;
this.receiver = receiver;
this.policyID = policyID;
this.faceValue = faceValue;
this.offeredAmount = offeredAmount;
this.isActive = isActive;
}
public UniqueIdentifier getLinearID() {
return linearID;
}
public AnonymousParty getSender() {
return sender;
}
public AnonymousParty getReceiver() {
return receiver;
}
public String getPolicyID() {
return policyID;
}
public double getFaceValue() {
return faceValue;
}
public double getOfferedAmount() {
return offeredAmount;
}
public boolean isActive() {
return isActive;
}
@NotNull
@Override
public UniqueIdentifier getLinearId() {
return linearID;
}
@NotNull
@Override
public List<AbstractParty> getParticipants() {
return Arrays.asList(sender,receiver);
}
@Override
public String toString() {
return super.toString();
}
}
我正在使用以下代码在 API 中查询但是,在邮递员输出中显示空括号,如 []。
@GetMapping(value = "/getOfferWithID",headers = "Content-Type=application/x-www-form-urlencoded")
private List<StateAndRef<OfferState>> getOfferWithID(HttpServletRequest request) throws IllegalArgumentException {
String s = request.getParameter("PolicyID");
return proxy.vaultQuery(OfferState.class).getStates().stream().filter(it->it.getState().getData().getPolicyID().equalsIgnoreCase(s)).collect(Collectors.toList());
}
你能告诉我,我如何在查询时过滤状态,这里出了什么问题?
是否有任何直接查询方法,以便我可以在 rpc 调用本身中过滤它,或者我真的需要为它写一个流程吗?
代码第一眼看起来不错,不确定哪里出了问题。传递给查询条件的 linearId
可能有问题。
作为参考,您可以查看以下运行良好的代码:
为了能够通过其属性之一查询您的状态,您必须:
- 为您所在的州创建自定义架构,请参阅 here and here 示例。
- 使用
VaultCustomQueryCriteria
查询您的属性 policyId
。阅读有关 VaultCustomQueryCriteria
here(搜索该术语并查找示例代码)的信息。
您当前的方法(使用 .filter(it->it.getState().getData().getPolicyID().equalsIgnoreCase(s))
)非常糟糕,本质上您是在提供所有状态的列表然后过滤该列表。
当您的查询 return 有 1000,000 个州时,您打算做什么?!您正在创建一个包含 1000,000 个条目的列表,然后循环遍历该列表以找到包含您的 policyId
的记录!!!这只会耗尽您的 Java 堆,减慢您的应用程序并使其崩溃。
始终通过在 Corda 中构建查询然后在数据库中 运行 将 search/query 委托给数据库(使用我已经概述的方法),你目前正在做的是制作select * from some_table
然后遍历所有结果,我的方法工艺 select * from some_table where policyId = xxx
,这将 return 一行。
在我的 Corda 项目中,我需要根据状态的某些特定字段检索特定状态 class,我为每个状态设置了 Unique。如何在 Corda 中做到这一点? state的实现如下:
@BelongsToContract(OfferContract.class)
public class OfferState implements LinearState {
private final UniqueIdentifier linearID;
private AnonymousParty sender;
private AnonymousParty receiver;
private final String policyID;
private final double faceValue;
private double offeredAmount;
private boolean isActive;
public OfferState(UniqueIdentifier linearID, AnonymousParty sender, AnonymousParty receiver, String policyID, double faceValue, double offeredAmount, boolean isActive) {
this.linearID = linearID;
this.sender = sender;
this.receiver = receiver;
this.policyID = policyID;
this.faceValue = faceValue;
this.offeredAmount = offeredAmount;
this.isActive = isActive;
}
public UniqueIdentifier getLinearID() {
return linearID;
}
public AnonymousParty getSender() {
return sender;
}
public AnonymousParty getReceiver() {
return receiver;
}
public String getPolicyID() {
return policyID;
}
public double getFaceValue() {
return faceValue;
}
public double getOfferedAmount() {
return offeredAmount;
}
public boolean isActive() {
return isActive;
}
@NotNull
@Override
public UniqueIdentifier getLinearId() {
return linearID;
}
@NotNull
@Override
public List<AbstractParty> getParticipants() {
return Arrays.asList(sender,receiver);
}
@Override
public String toString() {
return super.toString();
}
}
我正在使用以下代码在 API 中查询但是,在邮递员输出中显示空括号,如 []。
@GetMapping(value = "/getOfferWithID",headers = "Content-Type=application/x-www-form-urlencoded")
private List<StateAndRef<OfferState>> getOfferWithID(HttpServletRequest request) throws IllegalArgumentException {
String s = request.getParameter("PolicyID");
return proxy.vaultQuery(OfferState.class).getStates().stream().filter(it->it.getState().getData().getPolicyID().equalsIgnoreCase(s)).collect(Collectors.toList());
}
你能告诉我,我如何在查询时过滤状态,这里出了什么问题? 是否有任何直接查询方法,以便我可以在 rpc 调用本身中过滤它,或者我真的需要为它写一个流程吗?
代码第一眼看起来不错,不确定哪里出了问题。传递给查询条件的 linearId
可能有问题。
作为参考,您可以查看以下运行良好的代码:
为了能够通过其属性之一查询您的状态,您必须:
- 为您所在的州创建自定义架构,请参阅 here and here 示例。
- 使用
VaultCustomQueryCriteria
查询您的属性policyId
。阅读有关VaultCustomQueryCriteria
here(搜索该术语并查找示例代码)的信息。
您当前的方法(使用 .filter(it->it.getState().getData().getPolicyID().equalsIgnoreCase(s))
)非常糟糕,本质上您是在提供所有状态的列表然后过滤该列表。
当您的查询 return 有 1000,000 个州时,您打算做什么?!您正在创建一个包含 1000,000 个条目的列表,然后循环遍历该列表以找到包含您的 policyId
的记录!!!这只会耗尽您的 Java 堆,减慢您的应用程序并使其崩溃。
始终通过在 Corda 中构建查询然后在数据库中 运行 将 search/query 委托给数据库(使用我已经概述的方法),你目前正在做的是制作select * from some_table
然后遍历所有结果,我的方法工艺 select * from some_table where policyId = xxx
,这将 return 一行。