Node.js 类型化getRawOne<;T>;不返回类型T 我正在研究重构膝关节炎的API,并且我很难将原生PSQL查询转换为Type。我有下表、视图和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") } }

Node.js 类型化getRawOne<;T>;不返回类型T 我正在研究重构膝关节炎的API,并且我很难将原生PSQL查询转换为Type。我有下表、视图和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") } },node.js,nestjs,typeorm,Node.js,Nestjs,Typeorm,由于我想要返回的对象不是任何实体类型,我对如何选择它并返回正确的类有点茫然。我尝试了以下方法: this.challengeRepository.createQueryBuilder('c') .select('c.id', 'id') .addSelect('c.endDate', 'endDate') .addSelect('c.createdAt', 'createdAt') .addSelect('cr.score', 's

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

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>();
this.challengeRepository.createQueryBuilder('c')
.选择('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”和cr.“userId”=:userId',{userId})
.where('c.id=:id',{id})
.getRawOne();

它返回具有正确字段的对象,但该对象不是“ChallengeResultResponseDTO”类类型的对象。如果我试图调用函数“test”,应用程序就会崩溃。此外,使用challengeRepository但不返回质询会让人觉得很奇怪,我应该使用连接或实体管理器吗?

我很确定
getRawOne()
会返回一个JSON,该JSON看起来与您给出的泛型(T)类似,但不是该类的实例。您应该尝试使用
getOne()
来获取返回实体的实例

嘿,谢谢您的回答。存储库的类型为repository。由于ChallengeResultResponseDTO不是一个实体,因此我无法为它创建存储库。因此,getOne将返回一个挑战,而不是一个挑战者ResultResponseTo。如果我的响应与我的实体不同,我该怎么办?使用某种映射器,比如
类转换器
类到类
普通类。
如果类首先不存在于TypeORM的元数据下,它就无法用返回的结果为您实例化类。我为我的
pg
服务做了类似的事情,利用
plaintoClass
将原始JSON转换为类