You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 03:06:04