如何在TypeORM中将两张表的列映射为单个实体?
TypeORM多表映射为单个实体的实现方案
TypeORM完全支持将多张表的字段合并为单个应用层实体的需求,无需依赖常规的关联注解(如@OneToOne)来嵌套实体,下面提供两种实用的实现方式:
方法一:基于数据库视图实现(推荐)
这种方式更符合数据库设计规范,且读写操作的兼容性更好:
- 创建数据库视图:先在数据库中创建关联两张表的视图,假设两张表通过
order_id作为关联主键(请替换为你实际的关联字段):
CREATE VIEW vw_order AS SELECT o.order_id, o.number, o.res_code, o.open, o.date_start, o.date_end, o.obs, o.origin, co.detail, co.cause, co.action, co.type_code FROM MAIN_order o LEFT JOIN MAIN_corre_order co ON o.order_id = co.order_id;
- 实体映射到视图:直接将TypeORM实体关联到这个视图,字段映射规则和普通实体一致:
@Entity({ name: "vw_order" }) export class Order { @PrimaryColumn({ name: "order_id" }) public id: number; @Column({ name: "number" }) public num: number; @Column({ name: "res_code" }) public resCode: string; @Column() public open: boolean; @Column({ name: "date_start" }) public dateStart: Date; @Column({ name: "date_end" }) public dateEnd: Date; @Column() public obs: string; @Column() public origin: boolean; @Column() public detail: string; @Column() public cause: string; @Column() public action: string; @Column({ name: "type_code" }) public type: string; }
注意:如果需要支持写入操作,需确保你的数据库支持可更新视图,且两张表的关联是严格的一对一关系。
方法二:直接使用TypeORM实体查询表达式(无需创建视图)
通过@Entity的expression选项,直接指定关联两张表的SQL查询作为实体的数据源:
@Entity({ expression: (connection) => connection.createQueryBuilder() .select([ "o.order_id", "o.number", "o.res_code", "o.open", "o.date_start", "o.date_end", "o.obs", "o.origin", "co.detail", "co.cause", "co.action", "co.type_code" ]) .from("MAIN_order", "o") .leftJoin("MAIN_corre_order", "co", "o.order_id = co.order_id") }) export class Order { @PrimaryColumn({ name: "order_id" }) public id: number; @Column({ name: "number" }) public num: number; @Column({ name: "res_code" }) public resCode: string; @Column() public open: boolean; @Column({ name: "date_start" }) public dateStart: Date; @Column({ name: "date_end" }) public dateEnd: Date; @Column() public obs: string; @Column() public origin: boolean; @Column({ name: "detail" }) public detail: string; @Column({ name: "cause" }) public cause: string; @Column({ name: "action" }) public action: string; @Column({ name: "type_code" }) public type: string; }
注意:这种方式下,TypeORM无法自动将写入操作(插入、更新、删除)分发到两张原始表,因此更适合只读场景。如果需要支持写入,需在实体中自定义
beforeInsert、beforeUpdate等生命周期钩子,手动处理两张表的数据同步。
关键前提
无论使用哪种方式,都必须确保MAIN_order和MAIN_corre_order是一对一关联,否则查询结果会出现重复数据,违背单个实体的语义。
内容的提问来源于stack exchange,提问作者David Gaspar
相关产品推荐
相关产品推荐

