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

TypeORM中innerJoin与orderBy同时使用时查询报错求助

问题解决方法

你的问题出在orderBy中手动添加的双引号上。当使用innerJoinAndSelect关联表后,TypeORM生成SQL时会自动处理字段/别名的引号,你手动添加的双引号会导致PostgreSQL解析SQL时出现语法错误(生成重复的引号结构)。

修正方案有两种:

方案1:移除手动添加的双引号

直接使用别名likesCount,TypeORM会根据PostgreSQL的规则自动添加正确的引号:

let qb = this.dataSource.manager
      .createQueryBuilder(Post, 'p')
      .addSelect((qb) => {
        return qb
          .select('COUNT(cpl.post_id)')
          .from(PostLike, 'cpl')
          .where('cpl.post_id = p.post_id');
      }, 'likesCount')
      .innerJoinAndSelect('p.author_data', 'u')
      .skip((page - 1) * take)
      .take(take)
      .orderBy('likesCount', 'DESC').addOrderBy('p.reg_date', 'DESC')
      .getMany();

方案2:改用蛇形命名别名

将子查询的别名改为likes_count(蛇形命名),PostgreSQL对小写蛇形命名的别名不需要引号,避免引号相关的解析问题:

let qb = this.dataSource.manager
      .createQueryBuilder(Post, 'p')
      .addSelect((qb) => {
        return qb
          .select('COUNT(cpl.post_id)')
          .from(PostLike, 'cpl')
          .where('cpl.post_id = p.post_id');
      }, 'likes_count')
      .innerJoinAndSelect('p.author_data', 'u')
      .skip((page - 1) * take)
      .take(take)
      .orderBy('likes_count', 'DESC').addOrderBy('p.reg_date', 'DESC')
      .getMany();

原理:PostgreSQL对大小写敏感的标识符(比如驼峰命名的likesCount)需要用双引号包裹,但TypeORM会自动处理这个逻辑。你手动添加双引号后,TypeORM会再次给整个字符串添加双引号,最终生成""likesCount""这种非法的SQL语法,导致报错。移除手动引号后,TypeORM会生成正确的"likesCount"格式,关联表后也能正常解析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 17:22:02