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

