Seetharaman GR
Seetharaman GR

Reputation: 270

Writing Corda custom query by concating two schema column values and compare?

We have Name schema contains,

We are creating some states, schema with the definition.

But Now Want to field the states with values. We need to filter the values like (FirstName+LastName).equals("RockJohn").

We are trying to write the custom vault query.

Is there any way to achieve this?

Upvotes: 1

Views: 446

Answers (2)

Manos Batsis
Manos Batsis

Reputation: 92

You can use a Hibernate formula to create a dynamic/calculated property:

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

Then treat it as a regular property/field in your queries

Upvotes: 1

Joel
Joel

Reputation: 23140

In Java, you'd write something like:

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);

In Kotlin, you'd write something like:

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)
}

Upvotes: 1

Related Questions