如何查询Corda Vault并基于含指定字符串模式的字段检索State
Corda Vault模糊匹配查询解答
支持情况
Corda Vault原生支持字符串模糊匹配查询,效果与SQL语句的%xxx%模糊匹配完全一致,可以满足你筛选客户名称包含指定字符串的需求。
前置准备
在执行查询前,你需要先将State的客户名称、客户ID字段配置到自定义映射Schema中,示例配置如下:
// 1. 定义自定义映射Schema object CustomerSchemaV1 : MappedSchema( schemaFamily = CustomerSchema::class.java, version = 1, mappedTypes = listOf(PersistentCustomer::class.java) ) { @Entity @Table(name = "customer_states") class PersistentCustomer( @Column(name = "customer_id", nullable = false) val customerId: String, @Column(name = "customer_name", nullable = false) val customerName: String ) : PersistentState() } // 2. 在你的CustomerState类中关联上述Schema class CustomerState( val customerId: String, val customerName: String, override val participants: List<AbstractParty> ) : LinearState { override fun generateMappedObject(schema: MappedSchema): PersistentState { return when (schema) { is CustomerSchemaV1 -> CustomerSchemaV1.PersistentCustomer( customerId = customerId, customerName = customerName ) else -> throw IllegalArgumentException("Unsupported schema $schema") } } override fun supportedSchemas(): Iterable<MappedSchema> = listOf(CustomerSchemaV1) }
查询语法
使用Corda查询表达式的like运算符搭配通配符即可实现模糊匹配,示例代码如下:
// 构建模糊查询条件,匹配名称包含ash的记录 val fuzzyQueryCriteria = QueryCriteria.VaultCustomQueryCriteria( CustomerSchemaV1.PersistentCustomer::customerName.like("%ash%") ) // 执行Vault查询 val queryResult = serviceHub.vaultService.queryBy<CustomerState>(fuzzyQueryCriteria) // 提取匹配到的客户ID val matchedCustomerIds = queryResult.states.map { it.state.data.customerId }
补充说明
- 通配符规则与SQL标准一致:
%匹配任意长度的任意字符,_匹配单个任意字符 - 如果需要忽略大小写的模糊匹配,可将
like替换为ilike运算符 - 默认仅查询未消耗的State,如需查询包含已消耗的所有State,可在调用
queryBy时添加参数Vault.StateStatus.ALL
内容的提问来源于stack exchange,提问作者Gomathi priya
相关产品推荐
相关产品推荐

