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

