nestjs TypeORM 实践

2025/4/21 nestjsnodeTypeORM数据库

🌙 createQueryBuilder vs findOneBy

createQueryBuilderfindOneBy 都是 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
🌙 关联查询
const article = await this.articleRepository.createQueryBuilder('article')
  .leftJoinAndSelect('article.author', 'author')
  .where('article.id = :id', { id })
  .getOne();
1
2
3
4
🌙 分页查询
const [articles, count] = await this.articleRepository.createQueryBuilder('article')
  .skip(10)
  .take(20)
  .getManyAndCount();
1
2
3
4

🌙 ✅ 总结

场景 推荐方法
简单字段查询(如 id, email 等) findOneBy({id})
多条件、JOIN、分页、子查询等复杂查询 createQueryBuilder()