Heim > Java > javaLernprogramm > Hauptteil

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

Susan Sarandon
Freigeben: 2024-11-17 07:40:03
Original
120 Leute haben es durchsucht

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

Behebung des N 1-Problems in JPA und Hibernate

In JPA und Hibernate tritt ein N 1-Abfrageproblem auf, wenn mehrere Abfragen ausgeführt werden Abrufen verwandter Daten, was zu einem ineffizienten Datenabruf führt. Um dieses Problem zu lösen, bietet Hibernate eine Reihe von Techniken an.

Das N 1-Problem verstehen

Das Problem tritt auf, wenn eine erste Abfrage primäre Entitäten abruft und nachfolgende Abfragen ausgelöst werden um verwandte Daten abzurufen. Wenn Sie beispielsweise PostComment-Entitäten abrufen, ohne die zugehörige Post-Entität vorab abzurufen, wird Hibernate gezwungen, zusätzliche Abfragen für jede aufgerufene Post-Instanz auszuführen.

Lösung in Hibernate

1. Join-Abruf:

Durch die Verwendung der „Join-Abruf“-Strategie können die zugehörigen Daten zusammen mit den primären Entitäten in einer einzigen Abfrage abgerufen werden. In unserem Beispiel können wir verwenden:

List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc join fetch pc.post where pc.review = :review", PostComment.class)
    .setParameter("review", review)
    .getResultList();
Nach dem Login kopieren

2. Sammlungs-Vorabruf:

Beim Abrufen einer Sammlung primärer Entitäten und einer zusätzlichen Sammlung verwandter Daten ist es ratsam, letztere vorab abzurufen. Eine Möglichkeit besteht darin, die Sammlung in der ersten Abfrage vorab abzurufen:

List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc join fetch pc.post where pc.review = :review", PostComment.class)
    .setParameter("review", review)
    .getResultList();

List postTags = entityManager.createQuery("select pt from PostTag pt where pt.post in (:commentPosts)", PostTag.class)
    .setParameter("commentPosts", comments)
    .getResultList();
Nach dem Login kopieren

3. Sekundäre Abfrage:

In Fällen, in denen der Vorabruf nicht effizient ist oder mehrere untergeordnete Zuordnungen abgerufen werden müssen, kann eine sekundäre Abfragestrategie eingesetzt werden. Rufen Sie die primären Entitäten mit einer Basisabfrage ab und verwenden Sie eine nachfolgende Abfrage, um die zugehörigen Daten abzurufen.

Automatische Erkennung mit db-util

Die db-util-Bibliothek bietet eine Automatisierte Mittel zur Erkennung des N1-Abfrageproblems. JUnit-Asserts können verwendet werden, um die erwartete Anzahl generierter SQL-Anweisungen zu validieren und so das Problem frühzeitig im Entwicklungsprozess zu erkennen.

Das obige ist der detaillierte Inhalt vonWie können Sie das N 1-Abfrageproblem in JPA und Hibernate beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage