【问题标题】:TypeORM getRawOne<T> not returning type TTypeORM getRawOne<T> 不返回类型 T
【发布时间】:2021-02-04 06:02:07
【问题描述】:

我正在重构一个 koa api 来嵌套,我有点坚持将查询从原生 psql 重构为 typeorm。我有下表、视图和 dto。

@Entity()
export class Challenge {
  @PrimaryGeneratedColumn()
  id!: number;

  @Column()
  endDate!: Date;

  @CreateDateColumn()
  createdAt!: Date;
}

@ViewEntity({
    expression: (connection: Connection) => connection.createQueryBuilder()
      .select('SUM(cp.points)', 'score')
      .addSelect('cp.challenge', 'challengeId')
      .addSelect('cp.user', 'userId')
      .addSelect('RANK() OVER (PARTITION BY cp."challengeId" ORDER BY SUM(cp.points) DESC) AS rank')
      .from(ChallengePoint, 'cp')
      .groupBy('cp.challenge')
      .addGroupBy('cp.user')
})
export class ChallengeRank {
  @ViewColumn()
  score!: number;

  @ViewColumn()
  rank!: number;

  @ViewColumn()
  challenge!: Challenge;

  @ViewColumn()
  user!: User;
}

export class ChallengeResultReponseDto {
    @ApiProperty()
    id!: number;
  
    @ApiProperty()
    endDate!: Date;

    @ApiProperty()
    createdAt!: Date;
  
    @ApiProperty()
    score: number;
  
    @ApiProperty()
    rank: number;

    test() {
        console.log("test")
    }
}

由于我要返回的对象不是任何实体类型,我有点不知道如何选择它并返回正确的类。我尝试了以下方法:

this.challengeRepository.createQueryBuilder('c')
        .select('c.id', 'id')
        .addSelect('c.endDate', 'endDate')
        .addSelect('c.createdAt', 'createdAt')
        .addSelect('cr.score', 'score')
        .addSelect('cr.rank', 'rank')
        .leftJoin(ChallengeRank, 'cr', 'c.id = cr."challengeId" AND cr."userId" = :userId', { userId })
        .where('c.id = :id', { id })
        .getRawOne<ChallengeResultReponseDto>();

它返回一个具有正确字段的对象,但它不是类类型“ChallengeResultReponseDto”。如果我尝试调用函数“测试”应用程序崩溃。此外,使用 challengeRepository 但不返回挑战感觉很奇怪,我应该使用连接还是实体管理器来代替它?

【问题讨论】:

    标签: node.js nestjs typeorm


    【解决方案1】:

    我相当确定getRawOne&lt;T&gt;() 返回一个 看起来 像您提供的通用 (T) 的 JSON,但不是该类的实例。您应该尝试使用getOne() 来获取返回实体的实例

    【讨论】:

    • 您好,谢谢您的回答。存储库的类型为 Repository。由于 ChallengeResultReponseDto 不是实体,我无法为其创建存储库。因此 getOne 将返回挑战而不是 ChallengeResultReponseDto。如果我的回复与我的实体不同,我该怎么办?
    • 使用某种映射器,例如 class-transformerclassToClassplainToClass. 如果首先在 TypeORM 的元数据下不存在该类,那么它就不可能使用返回的结果为您实例化类。我为我的pg 服务做了类似的事情,利用plaintoClass 将原始 JSON 转换为一个类
    猜你喜欢
    • 2021-07-19
    • 1970-01-01
    • 2019-03-05
    • 2014-06-10
    • 2023-04-02
    • 2016-09-20
    • 2013-11-11
    • 1970-01-01
    • 2012-08-04
    相关资源
    最近更新 更多