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.