Hintergrund Objekte:Hibernate: Verschachtelte SQL-Aufruf Vermeiden für Kinder
Meine Anwendung JPA Kriterien wird unter Verwendung der Daten von DB und Dauerhaftigkeit Problem in zu viele SQL-Aufrufe im Zusammenhang identifiziert zu holen (für ein Kind Einheiten) zu DB.
Nehmen wir ein Beispiel hier:
ENTITY_A (parent) with 500 item types record
ENTITY_B (child-1) with 1000 item details record
ENTITY_C (child-2) with 1000 item details record
ENTITY_D (child-3) with 1000 item details record
wie pro Anforderung, wir brauchen ihre Kind holen Daten für übergeordnete Entität zusammen mit (alle Einheiten). Untergeordnete Entitäten sind bereits mit fetch=FetchType.LAZY
in der übergeordneten Entität zugeordnet.
Problem:
Wenn wir versuchen, 500 Elementtypen (ENTITY_A) zu holen, dann ist die Anzahl der SQL-Anrufe wird in folgenden Weise aufgerufen:
- 1 Aufruf zur Entity_A List (holen alle 500 Datensätze)
- 500 SQL-Aufrufe für Entity_B List (um Datensätze für die verknüpfte Eltern ID) (
- 500 SQL-Aufrufe für Entity_C Liste zu holen Datensätze für die verknüpfte Eltern ID holen)
- 500 SQL-Aufrufe für Entity_D List (um Datensätze für die verknüpfte Eltern ID zu holen)
Ich kenne einen alternativen ist von Kriterien zu SQL Prozeduraufruf zu wechseln (die alle Daten schließlich mit einer einzigen SQL zurück Aufruf in Form von SQL-Typen)
Gibt es einen alternativen Weg, mit dem wir die SQL-Aufrufe auf DB auf diese Weise begrenzen können?
Einige Ideen, wie die N + 1 zu beheben, wählt Problem in [diesem Thread] (https://stackoverflow.com/questions/32453989/what-is -die-Lösung-für-die-n1-Problem-im-Ruhezustand). –
Bei Kriterienabfragen können Sie 'root.fetch()' mit den untergeordneten Entitäten verwenden, um sie in dieselbe Abfrage zu laden. Der Unterschied zwischen einem regulären Join und einem Fetch-Join wird hier erläutert: https://stackoverflow.com/questions/17431312/difference-between-join-and-join-fetch-in-hibernate. Siehe auch hier: https://stackoverflow.com/questions/17306655/using-the-jpa-criteria-api-can-you-doa-a-fetch-join-that-results-in-only-one-joi zum Beispiel. – crizzis