🌙 createQueryBuilder
vs findOneBy
createQueryBuilder
和 findOneBy
都是 TypeORM
中用于查询数据的方法,但它们的使用场景和推荐程度有所不同。
createQueryBuilder
相比 findOneBy
有一些独特的优势和适用场景,虽然在简单查询时推荐使用 findOneBy
,但在一些复杂场景中,createQueryBuilder
是不可替代的。
🌙 ✅ createQueryBuilder
的优势
优势 | 描述 |
---|---|
🔍 支持复杂查询条件 | 可以构建多条件、模糊匹配、范围查询等复杂逻辑,例如:where("user.name LIKE :name", { name: '%Tom%' }) |
🧩 支持 JOIN 操作(关联表查询) | 能够轻松地进行跨表联查,如 leftJoinAndSelect('article.author', 'author') |
📈 分页查询支持 | 可配合 .skip() 和 .take() 实现分页功能 |
⚙️ 动态查询构造 | 可根据业务逻辑动态添加查询条件,非常适合复杂的业务场景 |
🔄 子查询支持 | 支持嵌套子查询,例如:.where(qb => qb.where('id IN ' + qb.subQuery().select(...))) |
🧪 可调试性更强 | 查询语句可以打印出来,便于调试,例如:.getSql() 或 .printSql() |
🌙 🧠 示例对比
🌙 1. 使用 findOneBy
(简单查询)
const article = await this.articleRepository.findOneBy({ id });
1
🌙 2. 使用 createQueryBuilder
(复杂查询)
🌙 多条件查询
const article = await this.articleRepository.createQueryBuilder('article')
.where('article.title = :title', { title: 'TypeORM 入门' })
.andWhere('article.author = :author', { author: '张三' })
.getOne();
1
2
3
4
2
3
4
🌙 关联查询
const article = await this.articleRepository.createQueryBuilder('article')
.leftJoinAndSelect('article.author', 'author')
.where('article.id = :id', { id })
.getOne();
1
2
3
4
2
3
4
🌙 分页查询
const [articles, count] = await this.articleRepository.createQueryBuilder('article')
.skip(10)
.take(20)
.getManyAndCount();
1
2
3
4
2
3
4
🌙 ✅ 总结
场景 | 推荐方法 |
---|---|
简单字段查询(如 id , email 等) | ✅ findOneBy({id}) |
多条件、JOIN、分页、子查询等复杂查询 | ✅ createQueryBuilder() |