TypeORM中何时优先用entity.find()而非createQueryBuilder()?二者是否等价?
查询逻辑是否等价
你给出的示例中,两种写法生成的SQL完全一致,查询逻辑是等价的。
但如果你的User实体配置了全局查询规则(比如软删除、多租户全局过滤、默认查询字段限制),findOne会自动应用这些规则,而createQueryBuilder默认不会继承,需要手动调用对应方法才能匹配,此时二者逻辑就不等价了。
性能差异
二者性能没有本质区别。find系列方法底层本身就是对createQueryBuilder的封装,只要最终生成的SQL相同,数据库执行效率完全一致,TypeORM层面的封装开销可以忽略不计。
优先使用find系列方法的场景
- 简单单表查询场景:单表的条件过滤、排序、分页等基础需求,
find写法更简洁,不需要手动写别名、参数绑定,代码可读性更高,维护成本更低。比如分页查询启用用户的写法:
对比用const users = await User.find({ where: { status: 1 }, skip: 0, take: 10, order: { createdAt: 'DESC' } })createQueryBuilder实现相同逻辑要写更多模板代码,冗余度高。 - 需要继承全局查询规则的场景:如果实体开了软删除、全局租户过滤等配置,
find系列会自动带上对应过滤条件,不需要手动编写,避免遗漏导致逻辑错误。 - 对类型安全要求高的场景:
find的入参和实体属性强绑定,TypeScript编译阶段就会校验属性名是否正确,比createQueryBuilder里写字符串形式的查询条件(比如user.username = :value)的拼写错误概率低很多。 - 快速开发场景:
find系列不需要写冗余的模板代码,开发效率更高。
内容的提问来源于stack exchange,提问作者Kid_Learning_C
相关产品推荐
相关产品推荐

