如何使用 typeorm 在 NestJS 框架中执行原始 SQL 查询

我将使用 Typeform 在 NestJS 框架上执行这么长的查询。请让我知道如何执行此查询。

select user.id, user.fullName, (select count(*) sendCnt from chat where senderId = user.id), (select count(*) recvCnt from chat where receiverId = user.id) from users user where user.role = 'Admin'
stack overflow How to excute Raw SQL Query on NestJS framework using typeorm
原文答案
author avatar

接受的答案

如果您使用 TypeORM ,则可以使用 @InjectConnection() 注入连接,并使用 query 运行RAW查询,如 TypeORM docs 中所示

const rawData = await connection.query(`SELECT * FROM USERS`);

假设您使用 @nestjs/typeormthis.connection 可以通过构造器中的 @InjectConnection() 装饰器获得

@Injectable()
export class FooService {
  constructor(@InjectConnection() private readonly connection: Connection) {}

  async doSomeQuery() {
    return this.connection.query('SELECT * FROM USERS;');
  }
}

从NEST V9(以及 @nestjs/typeorm @8中的某个地方,在版本中迟到)Typeorm v0.3.0, @InjectConnection() 被弃用。 @InjectDataSource() 应该使用


答案:

作者头像

您可以使用查询生成器来创建所需的查询 -

return await getRepository(users)
.createQueryBuilder("user")
.where("user.role = 'Admin'")
.select("user.id as userId")
.addSelect("user.fullName as fullName")
.addSelect("(select count(*) sendCnt from chat where senderId = user.id) as sendCnt")
.addSelect("(select count(*) recvCnt from chat where receiverId = user.id) as recvCnt")
.printSql()
.getRawMany();