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();
相关推荐
凤山老林3 分钟前
04-Java JDK, JRE和JVM
java·开发语言·jvm
camellias_6 小时前
【无标题】
java·tomcat
咸鱼2.07 小时前
【java入门到放弃】需要背诵
java·开发语言
椰猫子7 小时前
Java:异常(exception)
java·开发语言
等....7 小时前
Minio使用
数据库
win x8 小时前
Redis 使用~如何在Java中连接使用redis
java·数据库·redis
星晨雪海8 小时前
基于 @Resource 的支付 Service 多实现类完整示例
java·开发语言
阿维的博客日记8 小时前
什么是逃逸分析
java·juc
Ricky_Theseus8 小时前
C++右值引用
java·开发语言·c++
迷枫7129 小时前
DM8 数据库安装实战:从零搭建达梦数据库环境(附全套工具链接)
数据库