在 find() 中 TypeORM 查询相关的 oneToMany 值
Posted
技术标签:
【中文标题】在 find() 中 TypeORM 查询相关的 oneToMany 值【英文标题】:TypeORM query related oneToMany values in find() 【发布时间】:2021-01-17 00:39:59 【问题描述】:我有以下 SQL 查询,我想用 ORM 映射替换它:
SELECT primeid, name
FROM primes p INNER JOIN seconds s ON s.primeid = p.primeid
WHERE s.insertdate >= '2020-01-01 and s.insertdate <= '2020-01-31'
我有以下实体:
@Entity("primes")
export class PrimeEntity
@PrimaryColumn(name:'primeid')
primeId: number;
@Column()
name: string;
@OneToMany('SecondEntity','prime')
seconds: SecondEntity[];
@Entity("seconds")
export class SecondEntity
@PrimaryColumn(name:'secondid')
secondId: number;
@Column(name: 'insertdate')
insertDate: Date;
@ManyToOne('PrimeEntity', 'seconds')
@JoinColumn('primeid')
prime: PrimeEntity;
以下代码应返回与开头的 SQL 查询几乎相同的结果:
primeRepository.find(
relations: ['seconds'],
where:
seconds:
insertDate: Between('2020-01-01', '2020-01-31')
);
它应该返回
[
PrimeEntity primeId: 1, name: 'test', seconds: [SecondEntity secondId: 1, insertDate: '2020-01-01'],
...
]
但相反,我收到以下错误消息:
EntityColumnNotFound:未找到实体列“秒”。
也许有人可以帮助我...
谢谢你和最好的问候格雷格
【问题讨论】:
第二个表中没有primeId如何与primes表映射,在第二个表中添加primeId与ManyToOne关系 嗨,Haresh,感谢您的帮助。没有 where-block 的 find 现在可以工作了。但是,如果我再次添加 where-object 它会中断 使用查询生成器在关系表中添加 where 条件应该起作用 【参考方案1】:我一直在寻找可以使用我创建的自定义存储库并查询类似于上面示例的内容。我最终不得不这样做:
primeRepository.createQueryBuilder("prime")
.innerJoin("prime.seconds", "s")
.where("s.insertDate >= :startDate and s.insertDate <= :endDate", startDate: '2020-01-01', endDate: '2020-01-31')
.getMany()
上面的示例是我根据您的查询编写的以及我为使其正常工作所做的工作,不确定它是否会下降并“按原样”工作,您可能需要对其进行调整。如果您仍然需要解决方案,我只是想帮助您找到正确的方向。我希望在未来的版本中,他们会解决这个问题并使其更加直观。
【讨论】:
以上是关于在 find() 中 TypeORM 查询相关的 oneToMany 值的主要内容,如果未能解决你的问题,请参考以下文章
NestJS TypeORM MongoDB 无法使用 find 或 FindOne 搜索存储库
TypeORM:如何查询与字符串数组输入的多对多关系以查找所有字符串都应存在于相关实体列中的实体?