Order by count mit Spring Data JpaRepository
Bin ich mit Spring Data JpaRepository und ich finde es extrem einfach zu bedienen. Ich brauche all diese Funktionen - paging, Sortieren, filtern. Leider gibt es eine etwas unangenehme Sache, die scheint, mich zu zwingen, wieder fallen, um die Verwendung von einfachen JPA.
Brauche ich, um durch eine Größe der zugehörigen Sammlung. Zum Beispiel habe ich noch:
@Entity
public class A{
@Id
private long id;
@OneToMany
private List<B> bes;
//boilerplate
}
und ich muss Sortieren, indem bes.size()
Gibt es eine Möglichkeit irgendwie anpassen der Bestellung noch den Vorteil, pagination, Filter-und Spring Data tollen Funktionen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe das Rätsel gelöst, mit Tipps und Inspirationen aus:
Die erste und wichtigste Sache, die mir nicht bewusst waren über Frühling-Daten ist, dass selbst mit
@Query
benutzerdefinierte Methoden kann man immer noch erstellen paging-Abfragen, indem Sie einfach vorbei an derPageable
- Objekt als parameter. Dies ist etwas, die hätten ausdrücklich festgestellt, die von spring-data-Dokumentation, wie es ist definitiv nicht offensichtlich, aber sehr leistungsfähige Funktion.Toll, jetzt ist das zweite problem - wie kann ich eigentlich Sortieren Sie die Ergebnisse nach Größe der damit verbundenen Sammlung in JPA? Ich habe es geschafft, zu kommen, um eine folgende JPQL:
wo AwithBCount ist eine Klasse, die die Ergebnisse der Abfrage sind tatsächlich zugeordnet:
Aufgeregt, dass kann ich nun einfach definieren, mein-repository wie unten
Eilte ich zu versuchen, meine Lösung aus. Perfekt, die Seite zurückgegeben wird, aber wenn ich versuchte, Sie zu Sortieren durch bCount ich enttäuscht wurde. Es stellte sich heraus, da bei dieser ARepository (nicht AwithBCount repository) Frühling-Daten versuchen Sie, einen bCount Eigenschaft in Einer statt AwithBCount. Schließlich landete ich mit drei benutzerdefinierte Methoden:
...und einige zusätzliche bedingte Logik auf service-Ebene (die vermutlich gekapselt mit einer abstrakten repository-Implementierung). So, zwar nicht sehr elegant, dass die trick - auf diese Weise (mit mehr komplexen Entitäten) ich kann die Sortierung nach anderen Eigenschaften, die Filterung und die Paginierung.
c
wird hierAwithBCount(count(b.id) as bCount,c)
, und Sie brauchen nicht zu schreibencount(b.id) as bCount
nurcount(b.id)
wäre genugPage
von anderer Art alsA
?! Beim Versuch diese Lösung bekam ich eine Fehlermeldung, dass dieAwithBCount
nicht zugeordnete Entität.Eine option, die viel einfacher ist als die ursprüngliche Lösung und die hat auch zusätzliche Vorteile, ist die Erstellung einer Datenbank anzeigen von aggregierten Daten und der Verknüpfung Ihrer Person an diesem mittels einer
@SecondaryTable
oder@OneToOne
.Beispiel:
Mit
@SecondaryTable
Können Sie nun Sortieren, Filter, Abfragen etc rein mit Verweis auf entity A.
Als ein zusätzlicher Vorteil, den Sie haben innerhalb Ihrer domain Modell-Daten, kann teuer werden, um zu berechnen, in-memory z.B. der Gesamtwert aller Bestellungen für einen Kunden zimmerreserviereung, ohne das Sie laden alle Aufträge oder Wiederherstellung einer separaten Abfrage.
Ich weiß nicht viel über Spring Data, aber für JPQL, um die Objekte zu Sortieren durch Größe der zugehörigen Sammlung, können Sie die Abfrage