TypeORM查询嵌套关联时,如何指定选择嵌套关联字段?
如何在TypeORM中从嵌套关联中选择特定字段
我有一个包含嵌套关联的实体,希望从嵌套关联中选择特定字段。我的查询代码如下:
const data = await this.entityRepository.find({ select: { id: true, code: true, description: true, groupDetails: { primaryGroup: { id: true, }, }, }, relations: { groupDetails: { primaryGroup: true, secondaryGroup: true, }, } });
我期望返回的对象中包含groupDetails.primaryGroup.id,但结果里完全没有groupDetails字段。
若移除select中的groupDetails部分,代码如下:
const data = await this.entityRepository.find({ select: { id: true, code: true, description: true, }, relations: { groupDetails: { primaryGroup: true, secondaryGroup: true, }, } });
此时返回对象中会包含groupDetails字段。
请问该如何实现我想要的功能?
解决方案
问题核心是:当你同时指定嵌套relations和部分嵌套select时,TypeORM要求你显式声明要包含关联实体本身(哪怕只需要它的嵌套关联字段)。
修复方案1:显式指定关联实体的字段
在select的groupDetails节点下,添加该实体自身的某个字段(比如id),TypeORM就会将groupDetails纳入返回结果,同时保留你指定的嵌套字段:
const data = await this.entityRepository.find({ select: { id: true, code: true, description: true, groupDetails: { id: true, // 显式选择groupDetails自身的id字段 primaryGroup: { id: true, }, }, }, relations: { groupDetails: { primaryGroup: true, // 若不需要secondaryGroup,建议删除该行以减少冗余查询 // secondaryGroup: true, }, } });
修复方案2:简化关联层级+精准选择
如果你只需要primaryGroup.id,可以把relations简化为仅关联需要的层级,同时确保select的嵌套结构匹配:
const data = await this.entityRepository.find({ select: { id: true, code: true, description: true, groupDetails: { primaryGroup: { id: true, }, }, }, // 用数组形式指定关联层级,更简洁且避免不必要的关联 relations: ["groupDetails.primaryGroup"], });
注意事项
- 若
relations中包含了secondaryGroup但select未指定其字段,TypeORM会返回该实体的所有字段,这会造成冗余数据,建议只关联需要的层级。 - 如果
groupDetails没有需要选择的自身字段,也可以在select的groupDetails下直接写true(部分TypeORM版本支持),但更稳妥的方式是显式选择一个标识字段(如id)。
内容的提问来源于stack exchange,提问作者Yahli Gitzi
相关产品推荐
相关产品推荐

