TypeORM对jsonb提取字段做IN查询提示json=json运算符不存在如何解决
错误根因
你使用->运算符从jsonb字段提取值时,返回结果是jsonb类型而非原生标量(数值/字符串等)。PostgreSQL没有内置的json类型相等比较运算符,同时ORM会自动将你In查询中的参数转换为与查询字段匹配的json类型,最终触发operator does not exist: json = json报错。
解决方案
优先推荐第一种方案,性能和兼容性最优:
- 方案1:修改字段提取逻辑,返回原生标量类型
将原字段提取语句
company.data -> 'number' as company_number
改为显式转换为你需要的标量类型,比如数值类型可写为:
(company.data ->> 'number')::int as company_number
->>运算符会将json值提取为字符串格式,外层再通过::int强转为整数类型,最终返回的company_number是原生数值类型,可直接用于In条件比较。如果是字符串类型的编号,去掉::int强转即可。
- 方案2:不改字段提取逻辑,临时兼容查询
如果暂时无法修改字段提取逻辑,可以将查询参数手动转为json格式匹配:
this.find({ where: { company_number: In([1,2,3].map(item => JSON.stringify(item))) } });
该方案性能较差,仅作为临时兼容使用,不推荐长期使用。
- 方案3:TypeORM实体字段指定类型
如果你是通过TypeORM实体定义的company_number虚拟字段,可以在字段注解中显式指定类型为int,ORM会自动处理类型转换逻辑。
内容的提问来源于stack exchange,提问作者czlowiek488
相关产品推荐
相关产品推荐

