通过隐藏两个架构列值并进行比较来编写Corda自定义查询?

时间:2019-01-08 10:17:07

标签: corda

我们包含名称架构,

  • 名字:摇滚
  • 姓氏:John
  • 前缀:先生
  • MiddleName:“”
  • 后缀:“小”

我们正在创建带有定义的状态,模式。

但是现在想用值来表示状态。我们需要过滤像 (名字+姓氏).equals(“ RockJohn”)。

我们正在尝试编写自定义文件库查询。

有什么办法可以做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以使用Hibernate formula创建动态/计算属性:

@Formula(value = " concat(first_name, last_name) ")
String fullName

然后将其作为查询中的常规属性/字段

答案 1 :(得分:0)

在Java中,您将编写如下内容:

FieldInfo firstNameField = getField("firstName", NameSchemaV1.PersistentName.class);
FieldInfo lastNameField = getField("lastName", NameSchemaV1.PersistentName.class);

CriteriaExpression firstNameIndex = Builder.equal(firstNameField, "Rock");
CriteriaExpression lastNameIndex = Builder.equal(lastNameField, "John");

QueryCriteria firstNameCriteria = new QueryCriteria.VaultCustomQueryCriteria(firstNameIndex);
QueryCriteria lastNameCriteria = new QueryCriteria.VaultCustomQueryCriteria(lastNameIndex);

QueryCriteria criteria = firstNameCriteria.and(lastNameCriteria);
Vault.Page<ContractState> results = getServiceHub().getVaultService().queryBy(NameState.class, criteria);

在Kotlin中,您将编写以下内容:

val results = builder {
    val firstNameIndex = NameSchemaV1.PersistentName::firstName.equal("Rock")
    val lastNameIndex = NameSchemaV1.PersistentName::lastName.equal("John")

    val firstNameCriteria = QueryCriteria.VaultCustomQueryCriteria(firstNameIndex)
    val lastNameCriteria = QueryCriteria.VaultCustomQueryCriteria(lastNameIndex)

    val criteria = firstNameCriteria.and(lastNameCriteria)
    serviceHub.vaultService.queryBy(NameState::class.java, criteria)
}