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
相关产品推荐
相关产品推荐

