TypeORM查询如何仅获取Service实体及关联的employeeId
解决TypeORM查询仅返回Service全字段+关联employeeId的问题
下面是几种可行的方案,根据你的实际场景选择:
方案1:在Service实体中显式定义外键字段
默认情况下,TypeORM的@ManyToOne会隐式创建外键列,但实体里没有对应的属性,导致你无法直接在查询中选择它。显式添加外键字段就能解决这个问题:
// Service实体修改示例 import { Entity, Column, ManyToOne, JoinColumn, PrimaryGeneratedColumn } from "typeorm"; import { Employee } from "./Employee"; @Entity() export class Service { @PrimaryGeneratedColumn() id: number; @Column() serviceName: string; // 示例Service字段,替换成你的实际字段 // 显式声明外键字段,和数据库列对应 @Column() employeeId: number; @ManyToOne(() => Employee) // 指定关联到上面的employeeId字段,确保和数据库外键列名一致 @JoinColumn({ name: "employeeId" }) employee: Employee; }
之后查询时就能直接选择employeeId,甚至因为service.*已经包含这个字段,直接查询所有Service字段即可:
const services = await getRepository(Service) .createQueryBuilder("service") .select("service.*") .getMany(); // 返回的Service对象中会包含employeeId属性
方案2:直接查询数据库外键列(无需修改实体)
如果不想修改实体,可以通过QueryBuilder直接指定数据库中的外键列名,用getRawMany()获取原始数据:
// 假设数据库中外键列名为employeeId(根据你的实际表结构调整) const services = await getRepository(Service) .createQueryBuilder("service") .select("service.*") .addSelect("service.employeeId") .getRawMany();
这种方式返回的是数据库原始行数据,会包含Service所有字段和employeeId。
方案3:查询关联Employee的id后手动映射
如果必须保留原实体结构,也可以查询关联Employee的id,之后手动将其赋值为employeeId:
const services = await getRepository(Service) .createQueryBuilder("service") // 只关联查询Employee的id,避免拉取全量数据 .leftJoinAndSelect("service.employee", "employee", "employee.id = service.employeeId") .select(["service.*", "employee.id"]) .getMany(); // 手动处理数据,添加employeeId并移除完整Employee对象 const result = services.map(service => ({ ...service, employeeId: service.employee?.id, employee: undefined // 不需要的话可以删除这个属性 }));
内容的提问来源于stack exchange,提问作者Hung
相关产品推荐
相关产品推荐

