Repositories
Inject a repository to query and persist entities without writing raw SQL.
Syntax
@InjectRepository(User) repo: Repository<User>A repository is TypeORM's object for reading and writing one entity type. Nest injects it into your service using the @InjectRepository() decorator.
Registering and injecting
- Add
TypeOrmModule.forFeature([User])to the feature module's imports. - Inject
@InjectRepository(User) private repo: Repository<User>into the service.
The repository exposes methods like find(), findOne(), save(), and delete().
Example
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
@Injectable()
export class UsersService {
constructor(
@InjectRepository(User)
private readonly repo: Repository<User>,
) {}
findAll() {
return this.repo.find();
}
}When to use it
- A developer injects the User repository with @InjectRepository(User) to call findOne() without writing any SQL.
- A team uses the repository pattern to keep all database access in the service layer so controllers stay free of persistence concerns.
- An engineer uses repository.createQueryBuilder() when complex joins or conditional WHERE clauses cannot be expressed with the simple API.
More examples
Register entity in feature module
Registers the User entity with TypeOrmModule.forFeature so its repository is available for injection in the module.
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './user.entity';
import { UsersService } from './users.service';
@Module({
imports: [TypeOrmModule.forFeature([User])],
providers: [UsersService],
})
export class UsersModule {}Inject and use repository
Injects the TypeORM Repository<User> with @InjectRepository and uses it to query all users or find one by ID.
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
@Injectable()
export class UsersService {
constructor(
@InjectRepository(User)
private usersRepo: Repository<User>,
) {}
findAll(): Promise<User[]> {
return this.usersRepo.find();
}
findOne(id: number): Promise<User | null> {
return this.usersRepo.findOneBy({ id });
}
}QueryBuilder for complex query
Uses createQueryBuilder to perform a left join with a filter condition, demonstrating complex queries the simple API cannot express.
async findActiveUsersWithOrders(): Promise<User[]> {
return this.usersRepo
.createQueryBuilder('user')
.leftJoinAndSelect('user.orders', 'order')
.where('user.isActive = :active', { active: true })
.andWhere('order.total > :min', { min: 100 })
.getMany();
}
Discussion