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

问题描述 投票:0回答:1

我使用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. 文章重复 - 我在不同页面上有一篇不同作者的文章。

怎么解决这个问题?

java sql jpa eclipselink
1个回答
1
投票

FirstResult和MaxResult不能像在集合中使用fetch JOIN那样工作,因为它们是here所描述的数据库SQL性能操作。

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

© www.soinside.com 2019 - 2024. All rights reserved.