2017-01-01 8 views
0

Я использую eclipselink как поставщик JPA. У меня есть сущность, которая имеет много авторов (это поле отмечено @OneToMany(fetch = FetchType.EAGER)). Статья и авторы загружаются вместе, используя только один запрос sql (JOIN).JPA: @OneToMany (fetch = FetchType.EAGER), разбиение на страницы и дубликаты

Для работы с пагинацией я использую следующий код:

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. Статья дублирования - у меня есть один статью с разными авторами на разных страницах.

Как решить такую ​​проблему?

+0

Это ошибка вашего провайдера JPA. FirstResult/maxResults должны применяться к объектам Article, независимо от того, что еще выберет. Поднимите ошибку, если ее уже нет –

ответ

1

FirstResult и MaxResult не работают так, как вы ожидали бы при использовании наборов JOINs над коллекциями, поскольку они являются операциями производительности базы данных SQL, как описано here.

Не используйте соединение fetch по сопоставлению коллекции, если вам нужны абсолютные результаты разбивки на страницы - вместо этого используйте batch fetching. Это будет использовать 2 запроса, позволяя первыми правильно возвращать требуемые строки с разбивкой по страницам, а второй - возвращать строки, необходимые для отношения коллекции. Укажите ограничение IN или batch.type для ограничения вторичного запроса.