TypeORM QueryRunner 选择不同的

Posted

技术标签:

【中文标题】TypeORM QueryRunner 选择不同的【英文标题】:TypeORM QueryRunner Select distinct 【发布时间】:2019-07-07 01:36:19 【问题描述】:

下面是我的 SQL 查询:

Select distinct ports.port_name from orders left join port_master on orders.officeId = ports.portId;

如何使用 typeorm 查询运行器编写上述 SQL 来选择不同的端口名称?下面的语法获取所有端口

await queryRunner.manager.find(Orders, 
  relations: ["ports"],
  where: filter
).then((result: any) => 
  orders = result;
);

【问题讨论】:

【参考方案1】:

如果您使用的是 Postgresql,您可以使用 distinctOn,查询如下所示:

await getRepository(Feed)
      .createQueryBuilder('feed')
      .where( uploaderId: In([1,2,3,4]) )
      .distinctOn(['feed.uploaderId'])
      .orderBy( 'feed.uploaderId': 'ASC', 'feed.createdAt': 'DESC' )
      .getMany()

在上面的示例中,有一个 Feed 表,我想获取 Id 存在于给定数组中的行,并按 uploaderId 区分值,然后按 createdAt 日期对其进行排序

【讨论】:

【参考方案2】:
await this.createQueryBuilder("Entity name")
  .select('DISTINCT ("column")')
  .getRawMany();

【讨论】:

【参考方案3】:

另一种方法是使用查询生成器和distinct 方法

await this.createQueryBuilder('entity name')
  .select('column')
  .distinct(true)
  .getRawMany();

【讨论】:

【参考方案4】:

除了使用原始查询,您还可以使用下面提到的查询生成器

await getManager().createQueryBuilder(orders , "odrs")
.leftJoinAndSelect(ports, "pts", "odrs.officeId = pts.portId")
.select('DISTINCT odrs.port_name', 'port_name')
.orderBy("odrs.port_name", "ASC")
.getRawMany();

谢谢

【讨论】:

以上是关于TypeORM QueryRunner 选择不同的的主要内容,如果未能解决你的问题,请参考以下文章

TypeORM 选择列名的别名

TypeORM 选择 NULL 值

在 TypeORM 中使用 QueryBuilder 与 Repository 都有哪些不同的用例? [关闭]

DBUtils QueryRunner 实例化

typeORM 多对多关系不同情况的处理

Typeorm 连接多个数据库