gpt4 book ai didi

java - JPA:@OneToMany(fetch = FetchType.EAGER)、分页和重复

转载 作者:行者123 更新时间:2023-12-01 09:04:16 28 4
gpt4 key购买 nike

我使用 eclipselink 作为 JPA 提供程序。我有一篇实体文章,有很多作者(该字段标记为 @OneToMany(fetch = FetchType.EAGER) )。仅使用一个 sql 查询 (JOIN) 即可将文章和作者加载在一起。

为了使用分页,我使用以下代码:

String queryString="SELECT DISTINCT e FROM Article e LEFT JOIN FETCH e.authors";
Query query = em.createQuery(queryString);
query.setHint("eclipselink.join-fetch", "e.authors");
query.setFirstResult(position);
query.setMaxResults(amount);

当使用 setFirstResult 和 setMaxResults 时,据我所知,它们定义 limit part在sql查询中。结果我有两个问题:

  1. 当我想要获取 10 篇文章时,我只获取两篇文章,其中第一篇文章有​​ 4 位作者,第二篇文章有 6 位作者
  2. 文章重复 - 我的一篇文章在不同页面上有不同的作者。

如何解决这样的问题?

最佳答案

当在集合上使用 fetch JOIN 时,FirstResult 和 MaxResult 不会像您期望的那样工作,因为它们是数据库 SQL 性能操作,如所述 here

如果需要绝对分页结果,请不要在集合映射上使用 fetch join - 使用 batch fetching反而。这将使用 2 个查询,允许第一个查询正确返回分页所需的行,第二个查询返回集合关系所需的行。指定 IN 或 batch.type用于限制二次查询。

关于java - JPA:@OneToMany(fetch = FetchType.EAGER)、分页和重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41414874/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com