Heim >Java >javaLernprogramm >Wie können wir das N 1-Abfrageproblem in JPA und Hibernate beheben?
Behebung des N 1-Abfrageproblems in JPA und Hibernate
Das N 1-Problem entsteht, wenn eine Abfrage N Datensätze abruft und nachfolgende Abfragen damit zusammenhängen Datensätze, was zu zusätzlichen N Abfragen führt. Dies kann im Ruhezustand auftreten, wenn bei der ersten Abfrage keine Zuordnung abgerufen wird.
Ursache und Wirkung
Betrachten Sie zur Veranschaulichung diese JPA-Abfrage, die PostComment-Entitäten abruft:
List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc where pc.review = :review", PostComment.class) .setParameter("review", review) .getResultList();
Wenn wir anschließend die Kommentare durchlaufen und auf die Beitragszuordnung zugreifen, gibt Hibernate das folgende SQL aus Anweisungen:
SELECT pc.id AS id1_1_, pc.post_id AS post_id3_1_, pc.review AS review2_1_ FROM post_comment pc WHERE pc.review = 'Excellent!' INFO - Loaded 3 comments SELECT pc.id AS id1_0_0_, pc.title AS title2_0_0_ FROM post pc WHERE pc.id = 1 INFO - The post title is 'Post nr. 1' SELECT pc.id AS id1_0_0_, pc.title AS title2_0_0_ FROM post pc WHERE pc.id = 2 INFO - The post title is 'Post nr. 2' SELECT pc.id AS id1_0_0_, pc.title AS title2_0_0_ FROM post pc WHERE pc.id = 3 INFO - The post title is 'Post nr. 3'
Hier werden drei zusätzliche Abfragen ausgeführt, um die Post-Entitäten für jeden Kommentar abzurufen. Dies ist das N 1-Abfrageproblem.
Lösung
Um dieses Problem zu lösen, können wir die erforderlichen Zuordnungen mithilfe des Schlüsselworts JOIN FETCH schnell abrufen:
List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc join fetch pc.post p where pc.review = :review", PostComment.class) .setParameter("review", review) .getResultList();
Für mehrere untergeordnete Zuordnungen wird empfohlen, eine Sammlung in der ersten Abfrage abzurufen und den Rest über die sekundäre Abfrage zu laden Abfragen.
Automatisierte Erkennung
Um das N 1-Problem zu erkennen, ist es von Vorteil, Integrationstests mit SQL-Protokollierung und Asserts zu implementieren, um die erwartete Anzahl generierter SQL-Anweisungen zu überprüfen. Tools wie db-util können diesen Prozess unterstützen.
Das obige ist der detaillierte Inhalt vonWie können wir das N 1-Abfrageproblem in JPA und Hibernate beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!