求Hyperledger Composer Query Language带参数的CONTAINS运算符示例
Hyperledger Composer Query Language: 使用参数的CONTAINS运算符示例
我明白你在尝试用参数化的CONTAINS查询时遇到了问题——其实你的思路方向是对的,但写法上可能有个小细节没处理到位,导致查询无法正常运行。下面我给你几个正确的示例,以及排查问题的关键点:
基础参数化CONTAINS查询示例
首先,确保你的查询定义里参数的语法正确,以下是一个可运行的完整查询:
query findParticipantsWithMatchingRole { description: "查找角色字段包含指定参数值的参与者" participant: org.example.MyParticipant where: (role CONTAINS _$targetRole) sort: [ { field: id, direction: ASC } ] }
这里的_$targetRole就是我们要传递的参数,注意参数名前的_$前缀是Hyperledger Composer查询语言的要求,不能省略。
调用查询时的参数传递
定义好查询后,调用时需要正确传递参数值:
在JavaScript客户端中调用
// 假设已经建立了businessNetworkConnection连接 const matchingParticipants = await businessNetworkConnection.query( 'findParticipantsWithMatchingRole', { targetRole: 'admin' } // 这里的key要和查询里的参数名(去掉_$)一致 ); console.log('匹配的参与者:', matchingParticipants);
在Composer REST API中调用
如果通过REST API访问,直接在URL中传递参数即可:
GET /api/queries/findParticipantsWithMatchingRole?targetRole=admin
排查你遇到的问题
你的原写法WHERE (role CONTAINS _$role)可能遇到的问题:
- 参数名冲突:你的参数名
_$role和字段名role同名,虽然语法上允许,但容易造成混淆,建议改用不同的名称(比如上面的_$targetRole) - 字段类型不匹配:确认你的
role字段在CTO模型中是String类型——CONTAINS运算符仅支持字符串类型的字段查询 - 参数传递错误:调用查询时,确保传递的参数名和查询中定义的参数名(去掉
_$后)完全一致,大小写也要匹配
进阶:不区分大小写的CONTAINS查询
如果需要不区分大小写的匹配,可以结合LOWER()函数来实现:
query findParticipantsWithMatchingRoleCaseInsensitive { description: "不区分大小写查找角色字段包含指定参数值的参与者" participant: org.example.MyParticipant where: (LOWER(role) CONTAINS LOWER(_$targetRole)) sort: [ { field: id, direction: ASC } ] }
这样无论role字段里是大写还是小写,只要包含参数值的对应大小写形式,都能匹配到。
内容的提问来源于stack exchange,提问作者Jeson
相关产品推荐
相关产品推荐

