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

时间:2017-01-01 10:44:00

标签: java sql jpa eclipselink

我使用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时,据我所知,他们在sql查询中定义limit part。结果我有两个问题:

  1. 当我想获得10篇文章时,我只得到两篇文章,其中第一篇文章有​​4位作者,第二篇文章有6位作者
  2. 文章重复 - 我在不同页面上有一篇不同作者的文章。
  3. 如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

FirstResult和MaxResult不能像在集合中使用fetch JOIN那样工作,因为它们是https://laravel.com/docs/5.3/passport#password-grant-tokens所述的数据库SQL性能操作。

如果您需要绝对分页结果,请不要在集合映射上使用获取联接 - 请改用here。这将使用2个查询,允许第一个使用分页正确返回所需的行,第二个返回集合关系所需的行。指定IN或batch fetching用于限制辅助查询。