TypeORM使用Entity Repository查询关联表时where条件如何正确配置
问题描述
我尝试编写的查询语句使用Query Builder可以正常运行,但改用Entity Repository实现时却执行失败,具体问题如下:
可正常运行的Query Builder查询代码
const dispatchHeader2 = await this.dispatchHeaderRepository.createQueryBuilder('dh') .innerJoinAndSelect('dh.driver', 'driver') .innerJoinAndSelect('dh.vehicle', 'vehicle') .innerJoinAndSelect('vehicle.transportCompany', 'vtc') .innerJoinAndSelect('dh.order', 'o') .where('dh.order_id IN(:...ordersId)', { ordersId }) .andWhere('o.local_origin = :selected_dc', { selected_dc }) .getMany()
执行失败的Entity Repository查询代码
const dispatchHeader = await this.dispatchHeaderRepository.find({ relations: ['driver', 'vehicle', 'vehicle.transportCompany', 'order'], where: { order_id: In(ordersId), order: {local_origin:selected_dc } } })
复现现象
移除order: {local_origin:selected_dc }这行代码,查询可以正常执行,添加该行后查询无报错但仅返回空结果,查看生成的SQL语句发现没有携带任何查询参数。
解决方案
该问题由TypeORM版本适配、关联配置不匹配两类原因导致,可按以下步骤排查修改:
- 首先确认TypeORM版本,0.2.x版本对嵌套关联的where条件支持存在已知bug,建议先升级到0.3.x以上稳定版本。
- 版本符合要求的前提下,调整查询写法,显式指定关联加载策略为内连接,和QueryBuilder的查询逻辑保持一致:
const dispatchHeader = await this.dispatchHeaderRepository.find({ relations: { driver: true, vehicle: { transportCompany: true }, order: true }, where: { order_id: In(ordersId), order: { local_origin: selected_dc } }, relationLoadStrategy: 'join' })
- 若修改后仍返回空结果,检查
DispatchHeader实体中order关联的配置:
- 确认
@ManyToOne/@OneToOne装饰器关联的Order实体类型正确 - 确认关联的外键字段名确实为
order_id,和查询条件中使用的字段名完全匹配 - 确认
Order实体中local_origin字段的命名、类型和数据库表结构完全一致
内容的提问来源于stack exchange,提问作者Programmer89
相关产品推荐
相关产品推荐

