Trung BìnhNestJS iconNestJS

TypeORM Query Builder vs Repository API — khi nào dùng cái nào?

Repository API (High-level): phù hợp cho CRUD đơn giản, dễ đọc, type-safe:

typescript
const users = await this.usersRepo.find({
  where: { isActive: true, role: Role.USER },
  relations: ['profile'],
  order: { createdAt: 'DESC' },
  take: 20, skip: 0,
});

Query Builder (Low-level): cho queries phức tạp với dynamic conditions, subqueries, raw SQL expressions:

typescript
const result = await this.usersRepo
  .createQueryBuilder('user')
  .leftJoinAndSelect('user.posts', 'post')
  .where('user.isActive = :active', { active: true })
  .andWhere('post.publishedAt > :date', { date: lastWeek })
  .select(['user.id', 'user.email', 'COUNT(post.id) as postCount'])
  .groupBy('user.id')
  .having('COUNT(post.id) > 0')
  .orderBy('postCount', 'DESC')
  .getRawMany();

Dùng Repository API cho 80% cases.

Dùng Query Builder khi: complex JOINs, aggregations (COUNT/SUM/AVG), dynamic WHERE conditions, raw SQL expressions cần.

Xem toàn bộ NestJS cùng filter theo level & chủ đề con.

Mở danh sách NestJS