NestJS中TypeORM查询过滤关联实体报No entity column错误如何解决
问题原因
你遇到的"No entity column was found"报错是因为TypeORM 0.2.x及更早版本不支持在find方法的where参数中直接嵌套关联实体的过滤条件,TypeORM会将你写的albums.isActive识别为用户主实体上的字段,而主实体上不存在该字段,因此触发报错。
解决方案
方案1:使用QueryBuilder实现(全版本兼容,推荐)
QueryBuilder是TypeORM最灵活的查询方式,可以直接在关联时添加过滤条件,实现你要的效果:
const user = await this.usersRepository .createQueryBuilder('user') // 关联albums表,关联时直接添加isActive的过滤条件 .leftJoinAndSelect('user.albums', 'album', 'album.isActive = :isActive', { isActive: true }) .where('user.id = :id', { id }) .getOne();
如果需要过滤掉没有符合条件的albums的用户,将leftJoinAndSelect替换为innerJoinAndSelect即可。
方案2:升级到TypeORM 0.3.x版本后使用嵌套where
TypeORM 0.3.x版本优化了find系列方法的参数规则,已经支持直接嵌套关联实体的过滤条件,注意写法要适配0.3版本的入参规范(0.3版本的findOne方法不再支持直接传id作为第一个参数,必须将查询条件放到where属性中):
// TypeORM 0.3.x写法 const user = await this.usersRepository.findOne({ where: { id: id, albums: { isActive: true } }, relations: ['albums'] });
方案3:内存过滤(仅适用于数据量极小的场景,不推荐)
如果不想改查询逻辑,也可以先全量查询关联数据后,手动在代码中过滤albums数组:
const user = await this.usersRepository.findOne(id, { relations: ['albums'] }); // 手动过滤关联数组 user.albums = user.albums.filter(album => album.isActive);
内容的提问来源于stack exchange,提问作者Ashish
相关产品推荐
相关产品推荐

