在 NestJS 项目中,this.xxxRepository.createQueryBuilder() 是最常用、最规范的 QueryBuilder 使用方式。
本文以 UserEntity 为例,系统整理 QueryBuilder 对应的常见 SQL 写法 ,所有示例可直接复制使用。
一、基础准备
@Injectable()
export class UserService {
constructor(
@InjectRepository(UserEntity)
private readonly userRepository: Repository<UserEntity>,
) {}
}
以下示例默认写在 UserService 中。
一、新增 & 更新 & 删除
1. INSERT
return this.userRepository
.createQueryBuilder()
.insert()
.into(UserEntity)
.values({
name: '张三',
age: 18,
status: 1,
})
.execute();
批量新增
return this.userRepository
.createQueryBuilder()
.insert()
.into(UserEntity)
.values([
{ name: '张三', age: 18 },
{ name: '李四', age: 20 },
])
.execute();
2. UPDATE
return this.userRepository
.createQueryBuilder()
.update(UserEntity)
.set({ status: 0 })
.where('id = :id', { id })
.execute();
3. DELETE
return this.userRepository
.createQueryBuilder()
.delete()
.from(UserEntity)
.where('id = :id', { id })
.execute();
二、基础查询(SELECT)
1. 查询单表数据
SQL
SELECT * FROM user WHERE status = 1;
QueryBuilder
return this.userRepository
.createQueryBuilder('u')
.where('u.status = :status', { status: 1 })
.getMany();
2. 查询指定字段
SQL
SELECT id, name FROM user;
return this.userRepository
.createQueryBuilder('u')
.select(['u.id', 'u.name'])
.getMany();
3. 查询单条数据
return this.userRepository
.createQueryBuilder('u')
.where('u.id = :id', { id })
.getOne();
三、WHERE 条件用法
1. 多条件 AND / OR
SQL
SELECT * FROM user WHERE age > 18 AND status = 1;
return this.userRepository
.createQueryBuilder('u')
.where('u.age > :age', { age: 18 })
.andWhere('u.status = :status', { status: 1 })
.getMany();
OR
.orWhere('u.role = :role', { role: 'admin' })
2. IN 查询
SQL
SELECT * FROM user WHERE id IN (1,2,3);
return this.userRepository
.createQueryBuilder('u')
.where('u.id IN (:...ids)', { ids: [1, 2, 3] })
.getMany();
3. LIKE 模糊查询
SQL
SELECT * FROM user WHERE name LIKE '%张%';
return this.userRepository
.createQueryBuilder('u')
.where('u.name LIKE :name', { name: `%张%` })
.getMany();
四、排序 & 分页
1. ORDER BY
return this.userRepository
.createQueryBuilder('u')
.orderBy('u.createTime', 'DESC')
.getMany();
2. 分页查询
return this.userRepository
.createQueryBuilder('u')
.skip((page - 1) * pageSize)
.take(pageSize)
.getMany();
3. 分页 + 总数
return this.userRepository
.createQueryBuilder('u')
.skip((page - 1) * pageSize)
.take(pageSize)
.getManyAndCount();
五、JOIN 多表查询
1. LEFT JOIN
SQL
SELECT * FROM user u
LEFT JOIN order o ON u.id = o.user_id;
return this.userRepository
.createQueryBuilder('u')
.leftJoin(OrderEntity, 'o', 'o.userId = u.id')
.getMany();
2. LEFT JOIN 并返回关联数据
return this.userRepository
.createQueryBuilder('u')
.leftJoinAndSelect('u.orders', 'o')
.getMany();
⚠️ 前提:UserEntity 中定义了 @OneToMany(() => OrderEntity, ...)
六、聚合函数(COUNT / SUM)
1. COUNT 查询
return this.userRepository
.createQueryBuilder('u')
.where('u.status = :status', { status: 1 })
.getCount();
2. GROUP BY 统计
SQL
SELECT status, COUNT(*) total FROM user GROUP BY status;
return this.userRepository
.createQueryBuilder('u')
.select('u.status', 'status')
.addSelect('COUNT(*)', 'total')
.groupBy('u.status')
.getRawMany();
3. HAVING
return this.userRepository
.createQueryBuilder('u')
.select('u.status', 'status')
.addSelect('COUNT(*)', 'total')
.groupBy('u.status')
.having('COUNT(*) > :count', { count: 10 })
.getRawMany();
七、子查询
1. 子查询 IN
SQL
SELECT * FROM user
WHERE id IN (SELECT user_id FROM order WHERE amount > 100);
return this.userRepository
.createQueryBuilder('u')
.where(qb => {
const subQuery = qb
.subQuery()
.select('o.userId')
.from(OrderEntity, 'o')
.where('o.amount > :amount')
.getQuery();
return 'u.id IN ' + subQuery;
})
.setParameter('amount', 100)
.getMany();