TypeORM中leftJoin与leftJoinAndSelect的差异及查询异常咨询
TypeORM中leftJoin与leftJoinAndSelect的差异解析
核心差异本质
leftJoin的问题所在
leftJoin仅在SQL层面建立用户与钱包的关联查询,但不会处理一对多关系的结果映射逻辑。当你手动指定select钱包字段时,PostgreSQL会返回两行数据(一个用户对应两个钱包,一行对应一个钱包),但TypeORM默认会把这两行合并为同一个用户实体。合并过程中userWallets字段会被逐行赋值,最终只会保留最后一条钱包数据,所以数组里只剩一个元素。
leftJoinAndSelect的正确逻辑
leftJoinAndSelect是leftJoin的增强版,它不仅建立关联查询,还明确告知TypeORM需要处理一对多关系的结果聚合。TypeORM会自动识别这是一对多关联,在映射结果时,将同一用户的多条关联钱包记录收集到userWallets数组中,而非覆盖,因此能得到预期的两个钱包元素。
额外说明
如果非要用leftJoin实现同样效果,需要手动指定relations选项配合select,让TypeORM明确要处理该关联的映射:
await userRepository.find({ select: ['id', 'username', 'userWallets.id', 'userWallets.balance'], leftJoin: { wallets: 'user.userWallets' }, relations: ['userWallets'], })
不过这种写法直接用leftJoinAndSelect会更简洁。
内容的提问来源于stack exchange,提问作者piraha
相关产品推荐
相关产品推荐

