Heim  >  Artikel  >  Wie kann ich mit Spring JPA eingeschränkte Entitätsbeziehungen abrufen?

Wie kann ich mit Spring JPA eingeschränkte Entitätsbeziehungen abrufen?

王林
王林nach vorne
2024-02-08 22:20:101163Durchsuche

Bei der Verwendung von Spring JPA zum Abrufen von Entitätsbeziehungen müssen wir manchmal die Ergebnisse einschränken, um bestimmte Geschäftsanforderungen zu erfüllen. In diesem Artikel stellen wir vor, wie Sie Spring JPA verwenden, um eingeschränkte Entitätsbeziehungen abzurufen. Mithilfe der von Spring JPA bereitgestellten Abfrageanmerkungen und -methoden können wir problemlos Einschränkungen für Entitätsbeziehungen implementieren und so die Abfrageeffizienz und -genauigkeit verbessern. Unabhängig davon, ob Sie Anfänger oder erfahrener Entwickler sind, bietet Ihnen dieser Artikel klare Anleitungen und praktische Beispiele, die Ihnen helfen, die Funktionen zum Abrufen von Entitätsbeziehungen von Spring JPA besser zu verstehen und anzuwenden.

Frageninhalt

Dies ist ein Optimierungsproblem für Beziehungen und Datenbank-Roundtrips.

tl;dr: Sie haben zwei Entitäten a und b, die eine Viele-zu-Viele-Beziehung haben. Sie müssen eine Instanz von a und eine bestimmte Teilmenge der zugehörigen b-Entitäten abrufen. Das ist der wichtige Teil: Sie möchten nicht alle a-Entitäten abrufen, die mit dieser b-Instanz verknüpft sind, sondern nur eine Teilmenge davon.

Langer Anruf

Berücksichtigen Sie die folgenden Entitäten

public class a {

  @id
  private long id;

  @manytomany
  private list<b> blist;
}
public class B {

  @Id
  private Long id;

  @ManyToMany
  private List<A> aList;

  private Boolean somePropertyToUseWhileFiltering;
}

Ich versuche, eine Instanz einer a-Entität und eine Teilmenge ihrer zugehörigen b-Instanzen abzurufen. Meiner Meinung nach kann dies auf drei Arten erreicht werden

  1. Erhalten Sie beim Abrufen von a alle relevanten B-Entitäten und verwerfen Sie diejenigen, die Sie nicht benötigen.

  2. Führen Sie mithilfe von Lazy Relations zwei verschiedene Repository-Aufrufe durch: Rufen Sie zuerst eine a-Instanz ohne zugehörige b-Instanz ab und rufen Sie dann eine b-Instanz ab, die die erforderlichen Filter und Einschränkungen angibt.

  3. Schreiben Sie eine große benutzerdefinierte JPQL- oder SQL-Abfrage, um eine bestimmte Teilmenge von a-Instanzen und zugehörigen b-Instanzen abzurufen.

Die erste Methode gefällt mir überhaupt nicht, weil sie viele unnötige Zeilen abruft. Der dritte Ansatz ist wahrscheinlich der beste für komplexe Strukturen, aber warum sollte ich überhaupt eine Orm-Struktur verwenden?

Theoretisch sollte das alles funktionieren. Ich verwende derzeit die zweite Methode, habe aber Bedenken. Ist es schädlich, für eine einzelne Anfrage mehrere Repository-Aufrufe an verschiedene Repositorys durchzuführen? Weil ich eine komplexe Entitätsstruktur mit vielen Beziehungen habe. Ich vermute, dass dies die Anzahl der Roundtrips zur Datenbank erhöhen wird.

Gibt es einen anderen, geeigneteren Weg, dieses Problem zu lösen?

Workaround

Ich denke, Sie können verschachtelte Projektionen verwenden: Projektion

public interface awithfilteredblistprojection {

    long getid();

    list<bprojection> getfilteredblist();

    interface bprojection {
        string getsomepropertytousewhilefiltering();

        // add other properties from b that you want to include
    }
}

Repository

public interface ARepository extends JpaRepository<A, Long> {

    @Query("SELECT a FROM A a JOIN FETCH a.bList b WHERE a.id = :aId")
    Optional<AWithFilteredBListProjection> findAWithFilteredBList(@Param("aId") Long aId);
}

Das obige ist der detaillierte Inhalt vonWie kann ich mit Spring JPA eingeschränkte Entitätsbeziehungen abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen