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

TypeORM中getRawMany()与getMany()区别及查询返回空数组问题

问题原因解析

你遇到的getMany()返回空、getRawMany()正常返回的问题,核心是两种方法的结果映射逻辑不同:

为什么getMany()返回空

getMany()的核心作用是将查询结果映射为你当前仓库对应的实体实例(这里就是ChatRoomParticipant实体),映射的前提是必须查询到主实体的主键,TypeORM需要依赖主键完成实体的组装、去重、关联关系挂载。
而你的查询语句里只select("user.connectionId"),没有选中chatRoomParticipant的主键字段,TypeORM无法构造合法的ChatRoomParticipant实体实例,最终就返回了空数组。

如果要让getMany()正常返回,修改select语句补充主实体主键即可:

let otherParticipants = await chatRoomParticipantRepo
    .createQueryBuilder("chatRoomParticipant")
    .leftJoinAndSelect("chatRoomParticipant.user", "user")
    // 补充主实体主键
    .select(["chatRoomParticipant.id", "user.connectionId"])
    .where("chatRoomParticipant.chatRoomId = :chatRoomId AND chatRoomParticipant.userId != :userId")
    .setParameters({ chatRoomId: chatRoomId, userId: userId })
    .getMany();

修改后返回的结果会是ChatRoomParticipant实体数组,每个元素的user属性下会挂载connectionId的值。

二者核心区别

  • getRawMany():直接返回数据库执行SQL后的原始结果集,不做任何实体映射逻辑,不管你查询的是哪个表的字段、有没有查询主键,只要数据库返回了结果就会直接输出,字段名会自动加上关联别名前缀(比如你得到的user_connectionId就是关联别名user+字段名connectionId拼接而来),适合不需要实体实例、只需要原始字段值的场景,并不局限于聚合查询。
  • getMany():会按照实体定义完成结果的映射组装,会自动处理关联关系、字段类型转换、去重,必须查询到主实体的主键才能正常工作,适合需要使用实体实例、依赖实体内置方法或类型定义的场景。

补充:如果你只是需要获取connectionId的列表,用getRawMany()反而更高效,省去了实体映射的额外开销。


内容的提问来源于stack exchange,提问作者Alvin Stefanus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:45:10