Spring Data JPA. Wie man nur eine Liste von IDs von findAll () - Methode
Ich habe ein sehr kompliziertes Modell. Entity hat eine Menge Beziehungen und so weiter.
Ich versuche es mal mit Spring Data JPA aus und ich bereitete ein repository.
aber wenn ich auf eine metod findAll() mit Angabe der für das Objekt einen haben ein performance-Problem, weil Objekte sind sehr groß. Ich weiß, dass, weil, wenn ich eine Methode aufzurufen, wie diese:
@Query(value = "select id, name from Customer ")
List<Object[]> myFindCustomerIds();
Ich habe keine Probleme mit der performance.
Aber wenn ich rufe
List<Customer> findAll();
Hatte ich ein großes problem mit der Leistung.
Das problem ist, dass ich machen zu müssen findAll-Methode, mit der Spezifikationen für Kunden, dass ist der Grund, warum ich nicht verwenden Methode gibt eine Liste von arrays von Objekten.
Wie Sie schreiben, eine Methode zu finden, die alle Kunden-Spezifikationen für Customer-Entität, sondern gibt nur ein IDs.
wie diese:
List<Long> findAll(Specification<Customer> spec);
- Ich nicht verwenden können, in diesem Fall die Paginierung.
Bitte helfen.
InformationsquelleAutor der Frage user6778654 | 2015-05-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum nicht mit der
@Query
annotation?@Query("select p.id from #{#entityName} p")
List<Long> getAllIds();
Der einzige Nachteil, den ich sehe, ist, wenn das Attribut
id
verpasst, aber da dies ist eine sehr häufige Namen und kaum zu ändern (id = Primärschlüssel), diese sollte in Ordnung sein.InformationsquelleAutor der Antwort eav
Ist dies nun, unterstützt durch die Feder von Daten mit Projektionen:
Als in Ihrem
Customer
repositoryInformationsquelleAutor der Antwort Ondrej Bozek
Habe ich das problem gelöst.
(Als Ergebnis haben wir eine spärliche Kunde-Objekt nur mit id und name)
Definieren Sie Ihre eigenen repository:
Und eine Implementierung (denken Sie daran, über suffix - Impl als Standard)
InformationsquelleAutor der Antwort user6778654
Leider Projektionen funktioniert nicht mit Spezifikationen.
JpaSpecificationExecutor
Gegenzug nur eine Liste eingegeben mit den aggregierten root verwaltet das repository (List<T> findAll(Specification<T> var1);
)Einer tatsächlichen Lösung ist die Verwendung Tupel. Beispiel :
wo
Projections
ist eine funktionale Schnittstelle für root-Projektion.SingleTupleMapper
undTupleMapper
werden verwendet, um die anzeigen derTupleQuery
Ergebnis an das Objekt, das Sie wollen, um zurückzukehren.Anwendungsbeispiel :
Ich hoffe, es hilft.
InformationsquelleAutor der Antwort Radouane ROUFID