TypeORM+PostgreSQL使用驼峰别名addSelect报错,求解决方法
问题原因
PostgreSQL 对未用双引号包裹的标识符(包括列别名)会自动转换为小写,且会忽略驼峰式的分隔逻辑。当你使用驼峰别名bookingParticipantSortable时,PostgreSQL 实际会将其识别为全小写的bookingparticipantsortable,但后续orderBy中你依然用驼峰式名称引用,数据库找不到对应列,因此抛出"column does not exist"错误。而蛇形命名的booking_participant_sortable转换为小写后与原名称一致,所以能正常匹配。
保留驼峰别名的解决办法
要继续使用驼峰别名,需手动给别名加上双引号,强制PostgreSQL保留标识符的大小写格式。修改代码中addSelect部分的别名定义即可:
if (orderBy && orderBy.bookingParticipant) { queryBuilder .addSelect((subQuery) => { return subQuery .select( 'COUNT(eventParticipantCount.id)', '"bookingParticipantSortable"' // 子查询内的别名加双引号 ) .from(EventParticipant, 'eventParticipantCount') .where( "eventParticipantCount.event = event.id AND eventParticipantCount.bookingStatus = 'BOOKING' AND eventParticipantCount.isDeleted = false", ); }, '"bookingParticipantSortable"') // 外层的别名也加双引号 .orderBy('"bookingParticipantSortable"', orderBy.bookingParticipant); // orderBy里的引用同样加双引号 }
这样PostgreSQL会严格按照驼峰格式识别该别名,不会自动转换为小写,即可正常执行排序逻辑。
内容的提问来源于stack exchange,提问作者Vương
相关产品推荐
相关产品推荐

