Heim >Java >javaLernprogramm >Wie können wir das N 1-Abfrageproblem in JPA und Hibernate beheben?

Wie können wir das N 1-Abfrageproblem in JPA und Hibernate beheben?

Susan Sarandon
Susan SarandonOriginal
2024-11-13 06:26:021040Durchsuche

How Can We Address the N 1 Query Issue in JPA and Hibernate?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn