MirkoORM 中的 GroupBy

问题描述 投票:0回答:1

我有一个看起来像这样的实体:

@Entity({ tableName: 'certificates' })
@Unique({ properties: ['version', 'type'] })
export class CertificateEntity extends BaseEntity {
  @Property({ type: 'float' })
  version: number;

  @Property()
  name: string;

  @Property()
  type: CertificateType;

  @Property()
  description: string;
}

我正在尝试通过

version
获取每个
type
的最新证书列表。因此,只应出现每种类型的最高版本。

我在跑步

const r = await this.em.createQueryBuilder(CertificateEntity)
      .select(['type', 'version'])
      .groupBy('type')
      .execute();

但是我得到的是

{
    "statusCode": 500,
    "path": "/certificates/list",
    "errorType": "error",
    "errorMessage": "select \"c0\".\"type\", \"c0\".\"version\" from \"certificates\" as \"c0\" group by \"c0\".\"type\" - column \"c0.version\" must appear in the GROUP BY clause or be used in an aggregate function"
}

如果我按照错误消息的指示添加

version
。我刚拿到清单

[
    {
        "version": 1.7,
        "type": "s-type"
    },
    {
        "version": 1.6,
        "type": "s-type"
    },
    {
        "version": 1.5,
        "type": "s-type"
    }
]

我做错了什么?

typescript orm nestjs mikro-orm
1个回答
0
投票

错误提示“必须出现在 GROUP BY 子句中或在聚合函数中使用”,对于您想要执行的操作,第二部分有效,而不是第一部分。您希望对要选择的列使用聚合函数,但不按它们分组。这是因为分组可以为版本产生不同的值 - 并且根据您所说的内容,您应该选择

max(version)
而不仅仅是
version

试试这个:

const r = await this.em.createQueryBuilder(CertificateEntity)
      .select(['type', sql`max(version)`])
      .groupBy('type')
      .execute();

sql
是从
@mikro-orm/core
或任何其他驱动程序包导出的帮助程序,请参阅 https://mikro-orm.io/docs/raw-queries)

© www.soinside.com 2019 - 2024. All rights reserved.