TypeORM开发REST API时能否用表名字符串替代Entity获取Repository调用queryBuilder
TypeORM使用表名字符串执行查询的方案说明
首先直接回答核心疑问:getRepository 方法不支持直接传入数据库表名字符串,它接收的字符串参数是你定义的Entity类的实体名称(即@Entity()装饰器中配置的名称,默认是实体类的类名),而非底层数据库的实际表名。
如果你的需求是无需固定导入实体类、甚至无需提前定义实体类,就能针对任意表构建查询,可以参考以下两种可行方案:
- 方案1:已定义对应表的实体类,仅需用字符串替代实体类传入
getRepository
你可以直接传入实体类的名称调用getRepository,示例如下:
实体类定义参考:
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'; // 装饰器中name字段指定对应数据库表名,默认实体名为类名TableNameEntity @Entity({ name: 'Table_Name' }) export class TableNameEntity { @PrimaryGeneratedColumn() id: number; @Column() name: string; }
对应查询代码:
// 传入实体名称字符串即可获取对应仓库 const repository = getRepository('TableNameEntity'); const result = await repository.createQueryBuilder('t') .leftJoinAndSelect('t.tableA', 'TableA') .leftJoinAndSelect('t.tableB', 'TableB') .orderBy('TableA.name') .offset(5) .limit(10) .getMany();
- 方案2:无需提前定义实体类,直接针对任意表名构建查询
可以直接调用EntityManager的createQueryBuilder方法,第一个参数直接传入数据库表名即可,不需要关联任何实体类,更适合你要为任意实体生成REST API的场景:
import { getManager } from 'typeorm'; // 第一个参数填实际数据库表名,第二个参数为查询别名 const rawResult = await getManager() .createQueryBuilder('Table_Name', 't') // 手动指定关联条件,不需要提前在实体中配置关联关系 .leftJoin('TableA', 'ta', 'ta.table_id = t.id') .leftJoin('TableB', 'tb', 'tb.table_id = t.id') .orderBy('ta.name') .offset(5) .limit(10) // 无实体类场景下使用getRawMany获取原始查询结果 .getRawMany();
注意:不使用实体类的场景下,你需要手动拼写关联条件,返回结果为数据库原始字段值,不会自动做类型转换、驼峰/下划线命名转换等实体类自带的处理逻辑。
内容的提问来源于stack exchange,提问作者Wang Liang
相关产品推荐
相关产品推荐

