setMaxResults in JPA kombiniert mit Fetch join

In unserer Anwendung haben wir einen Suchbildschirm mit ein paar Filterfeldern. Wenn Sie auf die Suchschaltfläche klicken, wird eine Abfrage ausgeführt, die ein paar Ergebnisse abruft und sie in einem Raster auflistet.

Es gibt jedoch viele data, so dass wir die Anzahl der zurückgegebenen Ergebnisse auf maximal 1000 beschränken wollen. Wir verwenden OpenJPA, um die Rückgabedatensätze an unsere modelklassen und den SQL-server als database-Engine zuzuordnen. Für eine Weile habe ich die Menge der zurückgegebenen Ergebnisse mit diesem Code begrenzt:

return entityManager.createQuery(query).setMaxResults(1000).getResultList(); 

Das hat gut geklappt, bis ich vor kurzem ein paar Joins der ursprünglichen Abfrage hinzugefügt habe.

Sagen wir zum Beispiel, dass du 10 "Kontakte" bekommen möchtest. Jeder Kontakt hat 5 Adressen. Wenn ich die folgende Abfrage ausführe:

 select c from Contact c left join fetch c.address 

Die tatsächliche Abfrage, die ausgeführt wird, wählt 50 datasätze (5 Zeilen pro Kontakt, 1 für jede Adresse). Und das für die 10 Kontakte.

und beschränken Sie es auf 10 Ergebnisse und überprüfen Sie die Abfrage, die gegen die database ausgeführt wird, wird es in "SELECT TOP 10 FROM …" übersetzt.

Dies entspricht 10 datasätzen , nicht 10 Entitäten. Also in meinem Beispiel würde die zurückgegebene list der Kontakte 2 Kontakte mit ihren 5 Adressen enthalten.

Also das bringt mich zu meiner Frage: Was kann ich tun, um sicherzustellen, dass die vollständigen data von 10 Entitäten anstelle der ersten 10 datasätze zurückgegeben werden?

    Ich nehme an, dass ein Kontakt nicht genau 5 Adressen haben kann (Ursache, wenn das wahr wäre, wäre die Antwort trivial).

    Sie haben keine Abfrage-Konstrukt in entweder SQL (soweit ich weiß, obwohl Sie die Dokumentation Ihres Herstellers überprüfen sollten) oder JPQL, die eine Abfrage machen können, um zu tun, was Sie wollen. Ihre einzige Option wäre also, eine Seite aus der DB zu holen, wie Sie es jetzt tun, dann zählen Sie die Anzahl der zurückgegebenen Kontakte und holen Sie dann die nächste Seite, wenn Sie mehr brauchen, und so weiter, bis Sie genug Kontakte gezogen haben. Um dies zu tun, würdest du setFirstResult sowie setMaxResults verwenden.