news 2026/4/18 7:31:46

NestJS-TypeORM QueryBuilder 常用 SQL 写法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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();
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 23:51:26

嵌入式信号处理入门:Cortex-M4单精度浮点数快速理解

嵌入式信号处理实战&#xff1a;吃透Cortex-M4的单精度浮点运算你有没有遇到过这种情况&#xff1f;在STM32上跑一个IIR滤波器&#xff0c;输入稍一大就“发散”了&#xff1b;或者用MATLAB调好的算法&#xff0c;移植到MCU上结果完全不对——查来查去&#xff0c;原来是定点数…

作者头像 李华
网站建设 2026/4/12 7:59:51

如何高效采集小红书数据:实战操作手册与完整指南

在小红书成为内容营销重要阵地的今天&#xff0c;掌握数据采集技能已成为运营人员的必备能力。本手册将手把手教你使用专业工具实现小红书用户画像分析、内容数据挖掘、竞品监控等核心功能。无论你是内容运营专员、市场分析师还是数据研究人员&#xff0c;这套完整的实战指南都…

作者头像 李华
网站建设 2026/4/17 0:37:37

Downkyi画质调校全攻略:解锁视频下载的黄金配置法则

当高清视频遇上性能瓶颈&#xff0c;如何让每一帧画面都完美呈现&#xff1f;今天我们将深入探讨downkyi这款强大工具的画质配置方法&#xff0c;帮助你在视觉盛宴与硬件限制间找到最佳平衡点。 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具…

作者头像 李华
网站建设 2026/4/15 15:17:48

Hitboxer SOCD优化器:专业级游戏按键冲突终极解决方案

在激烈的竞技游戏对局中&#xff0c;你是否曾因按键冲突而错失关键操作&#xff1f;当W和S、A和D同时按下时角色停滞不前的尴尬场景&#xff0c;现在有了完美的解决方案。Hitboxer SOCD优化器通过先进的冲突检测算法&#xff0c;彻底解决游戏中的按键干扰问题&#xff0c;让你的…

作者头像 李华
网站建设 2026/4/12 17:12:18

如何用Thief-Book IDEA插件实现隐秘阅读?完整配置与使用指南

如何用Thief-Book IDEA插件实现隐秘阅读&#xff1f;完整配置与使用指南 【免费下载链接】thief-book-idea IDEA插件版上班摸鱼看书神器 项目地址: https://gitcode.com/gh_mirrors/th/thief-book-idea 在快节奏的编程工作中&#xff0c;开发者们常常需要在代码编译、调…

作者头像 李华
网站建设 2026/4/13 19:41:10

QQ音乐加密文件免费转换工具:qmcdump完整使用教程

QQ音乐加密文件免费转换工具&#xff1a;qmcdump完整使用教程 【免费下载链接】qmcdump 一个简单的QQ音乐解码&#xff08;qmcflac/qmc0/qmc3 转 flac/mp3&#xff09;&#xff0c;仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 你是否曾经…

作者头像 李华