TypeORM中通过父实体查询获取所有子实体数据的方案咨询
问题原因
你当前使用的是TypeORM默认的具体类独立表映射逻辑:仅作为公共字段抽象的Notification没有被标记为可继承实体类,数据库不会生成对应的NOTIFICATION表,所有父类字段仅会分别下沉到NotificationType1、NotificationType2对应的notification_type1、notification_type2表中,因此直接查询NOTIFICATION表必然返回空结果。
解决方案
有两种常用方案可实现通过父类统一查询所有子实体数据:
方案1:使用单表继承(推荐,适配你的无额外字段场景)
修改父类和子类的装饰器,开启TypeORM单表继承能力,所有子实体数据会统一存储到父类对应的notification表中,通过鉴别字段区分子类类型:
- 父类改造:
import { Entity, TableInheritance, PrimaryGeneratedColumn, Column } from "typeorm"; @Entity() @TableInheritance({ column: { type: "varchar", name: "notification_type" } }) export abstract class Notification { @PrimaryGeneratedColumn() id: number; @Column({type: "date",nullable: false}) seenAt: Date; @Column({ type: "integer", nullable: false }) priority: number; }
- 子类改造:
import { ChildEntity } from "typeorm"; @ChildEntity() export class NotificationType1 extends Notification {}
import { ChildEntity } from "typeorm"; @ChildEntity() export class NotificationType2 extends Notification {}
改造完成后直接执行SELECT * FROM notification即可获取所有子表数据,使用TypeORM的Notification仓库执行find()查询还会自动将结果映射为对应子类的实例。
方案2:保留独立表结构,使用UNION拼接查询
如果不想调整现有表结构,需要保留两个子实体独立表的设计,可以直接用UNION ALL拼接两个子表的查询结果:
SELECT *, 'type1' AS notification_type FROM notification_type1 UNION ALL SELECT *, 'type2' AS notification_type FROM notification_type2
因为两个子类完全继承父类没有额外字段,两张表的字段顺序、类型完全一致,拼接后不会出现字段不兼容的问题。如果需要在TypeORM中实现,可使用QueryBuilder构造UNION查询,无需手写原生SQL。
方案选型参考
- 单表继承适合子类差异小、额外字段少的场景,查询性能更高,无需拼接多表;
- 独立表+UNION适合子类差异大、存在大量独有字段的场景,可避免单表冗余空字段,但子表越多查询性能越低。
内容的提问来源于stack exchange,提问作者dzdmmtf
相关产品推荐
相关产品推荐

