当查询开始复杂时,只靠 find 系列就会越来越别扭。
这时你需要 QueryBuilder。
可以把它理解成:
不是日常施工,而是复杂施工单深化编制。
const posts = await dataSource
.getRepository(Post)
.createQueryBuilder("post")
.leftJoinAndSelect("post.author", "author")
.where("author.isActive = :isActive", { isActive: true })
.andWhere("post.title ILIKE :keyword", { keyword: "%TypeORM%" })
.orderBy("post.id", "DESC")
.take(10)
.getMany();这类查询为什么需要 QueryBuilder?
因为它擅长:
- 显式
join - 复杂
where - 条件拼装
- 排序、分页
- 聚合、分组
- 精细控制返回结果
- 在 ORM 映射和 SQL 之间保持可读的中间层
#它的心智不是“更复杂的 Repository”
而是:
Repository.find
= 常规施工
QueryBuilder
= 需要画精细施工单的时候#一个特别实用的判断标准
如果你开始频繁遇到这些情况:
- 动态条件组合
- 多表 join
- 聚合统计
- 子查询
- 需要看清生成的 SQL 语义
那就不要硬把所有事情都塞进 find 选项里。
该上 QueryBuilder 就上。