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

TypeORM查询含jsonb列实体 按json属性排序报错如何解决?

问题原因

你遇到的报错是因为TypeORM默认会将collection.stats.one_day_volume的点语法解析为关联表stats下的one_day_volume字段,而不是识别为stats jsonb字段内的属性,因此会抛出找不到stats表的错误。

解决方案

PostgreSQL中访问jsonb字段内部属性需要使用专用的jsonb操作符,修改你的orderBy语句即可:

const result = await getRepository(Collection)
  .createQueryBuilder('collection')
  // 核心修改:使用PostgreSQL jsonb操作符读取属性并转为数值类型排序
  .orderBy(`(collection.stats ->> 'one_day_volume')::numeric`, "DESC")
  .take(take)
  .skip(skip)
  .getMany();

也可以使用TypeORM提供的Raw函数编写原生字段逻辑,兼容性更好:

import { Raw } from "typeorm";

const result = await getRepository(Collection)
  .createQueryBuilder('collection')
  .orderBy(Raw(alias => `(${alias}.stats ->> 'one_day_volume')::numeric`), "DESC")
  .take(take)
  .skip(skip)
  .getMany();
语法解释
  • ->>:PostgreSQL jsonb类型的专用操作符,用于获取指定键对应的文本值
  • ::numeric:将读取到的文本值转为数值类型,避免字符串排序出现"100" < "20"的异常结果
  • 如果需要处理stats字段不存在one_day_volume的空值场景,可以在排序规则后追加NULLS LAST或NULLS FIRST指定空值的排序位置,示例:
.orderBy(`(collection.stats ->> 'one_day_volume')::numeric`, "DESC", "NULLS LAST")

内容的提问来源于stack exchange,提问作者user16780074

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:36:03