NestJS-TypeORM QueryBuilder 常用 SQL 写法

在 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();
相关推荐
HAPPY酷1 分钟前
从Public到Private:UE5 C++类创建路径差异全解析
java·c++·ue5
@小柯555m7 分钟前
MySql(高级操作符--Where in 和Not in)
数据库·sql·mysql
许彰午9 分钟前
CacheSQL(一):手写数据库的工程化重生
java·数据库·缓存
MmeD UCIZ9 分钟前
MySQL单表存多大的数据量比较合适
数据库·mysql
shjita12 分钟前
记录java执行中的一个错误细节
java·开发语言
空中海13 分钟前
Docker入门到精通
java·docker·eureka
itzixiao25 分钟前
L1-067 洛希极限(10分)[java][python]
java·开发语言·算法
SarL EMEN32 分钟前
mysql之联合索引
数据库·mysql
java1234_小锋32 分钟前
Spring AI 2.0 开发Java Agent智能体 - Spring AI项目调用本地Ollama模型
java·人工智能·spring·spring ai2.0
二哈赛车手32 分钟前
新人笔记---多策略搭建策略执行链实现RAG检索后过滤
java·笔记·spring·设计模式·ai·策略模式