0

例如,让我们定义这些实体:

@Entity()
export class Author {

  @OneToMany(() => Book, book => book.author)
  books = new Collection<Book>(this);
}

@Entity()
export class Book {

  @Property()
  name: string;

  @ManyToOne()
  author: Author;
}
const authors = await authorRepository.find({ books: {name: 'Test'} }, { 
  limit: 10
});

如您所见,我想选择所有书籍名称为“Test”的作者,但这将生成以下查询:

select `e0`.* from `author` as `e0`
left join `book` as `e1` on `e0`.`id` = `e1`.`author_id` 
where `e1`.`name` = 'Test' limit 10

问题是当我有超过 2 位作者并且他们每个人都有超过 10 本书的名称为“测试”时,由于限制子句,此查询将仅返回第一作者。

我不确定这是 ORM 中的错误还是预期的行为。

解决此问题的一种方法是选择没有限制子句的所有行并像在休眠中一样在内存中进行分页,但我不确定非常大的表将使用多少内存,这可能会阻塞事件循环NodeJS 同时处理它们。

4

1 回答 1

1

您可以在此处回退到查询生成器以应用 group by 子句:

const qb = await authorRepository.createQueryBuilder('a');
qb.select('a.*').where({ books: { name: 'Test' } }).limit(10).groupBy('a.id');
const authors = await qb.getResult();

会考虑如何通过 EM/repository API 直接支持这个用例。

于 2020-04-12T10:11:21.017 回答