2017-01-01 2 views
0

Ich benutze Eclipselink als JPA-Anbieter. Ich habe einen Entity-Artikel, der viele Autoren hat (dieses Feld ist mit @OneToMany(fetch = FetchType.EAGER) gekennzeichnet). Artikel und Autoren werden zusammen mit nur einer SQL-Abfrage (JOIN) geladen.JPA: @OneToMany (fetch = FetchType.EAGER), Seitenumbruch und Duplikate

mit Paginierung arbeiten ich den folgenden Code verwenden:

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); 

Wenn setFirstResult und setMaxResults sie verwendet werden, wie ich sie verstehe, limit part in SQL-Abfrage definieren. Als Ergebnis habe ich zwei Probleme:

  1. Wenn ich will 10 Artikel bekommen bekomme ich nur zwei Artikel, in denen der erste Artikel 4 Autoren hat, und die zweite 6 Autoren
  2. Artikel Duplizierung - Ich habe eine Artikel mit verschiedenen Autoren auf verschiedenen Seiten.

Wie löst man solch ein Problem?

+0

das ist ein Fehler in Ihrem JPA-Anbieter. Die firstResult/maxResults sollte für die Artikelobjekte gelten, unabhängig davon, was sonst noch abgerufen wird. Erhebe einen Fehler, wenn noch keiner vorhanden ist –

Antwort

1

FirstResult und MaxResult funktionieren nicht wie erwartet, wenn Abruf-JOINs über Auflistungen abgerufen werden, da es sich um Datenbank-SQL-Leistungsoperationen handelt, wie beschrieben here.

Verwenden Sie keine Fetch-Verknüpfung über eine Auflistungszuordnung, wenn Sie absolute Paginierungsergebnisse benötigen - verwenden Sie stattdessen batch fetching. Dies verwendet 2 Abfragen, die es dem ersten erlauben, die erforderlichen Zeilen mit Paginierung korrekt zurückzugeben, und die zweite, um die für die Sammelbeziehung erforderlichen Zeilen zurückzugeben. Geben Sie das IN oder batch.type an, um die sekundäre Abfrage zu begrenzen.

Verwandte Themen