Flutter使用Supabase查询jsonb数组字段匹配对象时报错如何解决
问题核心原因
你的items列是jsonb类型(存储一整个JSON数组),而Supabase Flutter SDK提供的默认contains方法是为PostgreSQL原生数组类型(比如int[]/text[]/jsonb[])设计的,二者不兼容是报错的根本原因。
两个方案的报错说明
- 方案1直接传入Dart的
List<Map>:SDK会将其转换为PostgreSQL数组格式传入jsonb类型字段,类型不匹配触发invalid input syntax for type json错误。 - 方案2传入
jsonEncode后的字符串:SDK会将字符串尝试解析为PostgreSQL数组字面量,格式不匹配触发malformed array literal错误。
解决方案
场景1:需要查询items包含你给定列表的所有元素
直接使用filter方法手动指定jsonb类型的包含操作符@>即可:
await dbClient.from("polls") .select() // 手动指定jsonb包含操作符 .filter('items', '@>', poll.items.map((i) => i.toJson()).toList()) .execute();
场景2:需要查询items包含你给定列表的任意至少一个元素
遍历你的查询列表拼接or条件即可:
final query = dbClient.from("polls").select(); for (final item in poll.items) { // 每个条件单独匹配一个元素是否存在 query = query.or('items @> ${jsonEncode([item])}'); } final result = await query.execute();
补充说明
如果你确实把items列设置为PostgreSQL原生的jsonb[]类型(每个元素是独立的jsonb对象,不是一整个JSON数组),可以直接使用contains方法,但需要提前将每个PollItem序列化为JSON字符串再放到数组里传入:
await dbClient.from("polls") .select() .contains('items', poll.items.map((i) => jsonEncode(i.toJson())).toList()) .execute();
内容的提问来源于stack exchange,提问作者clooock
相关产品推荐
相关产品推荐

