JPQL Erstellen Sie ein neues Objekt in der Auswahlanweisung - Vermeiden Sie oder umarmen Sie?
Frage
Ich habe kürzlich erfahren, dass es möglich ist, neue Objekte in zu erstellen JPQL
Aussagen wie folgt:
select new Family(mother, mate, offspr)
from DomesticCat as mother
join mother.mate as mate
left join mother.kittens as offspr
Ist das etwas, das man vermieden oder eher umarmen kann? Wann ist die Verwendung dieser Funktion im Lichte guter Praktiken gerechtfertigt?
Lösung
Vermeiden Sie es nicht, das ausgewählte Neue ist da, da es perfekt gültige Anwendungsfälle dafür gibt, wie in der erinnert §10.2.7.2. JPQL -Konstruktorausdrücke in der Auswahlklausel des EJB 3.0 JPA -Spezifikation:
Ein Konstruktor kann in der Auswahlliste verwendet werden, um eine oder mehrere Java -Instanzen zurückzugeben. Die angegebene Klasse muss kein Unternehmen sein oder der Datenbank zugeordnet werden. Der Konstruktorame muss vollständig qualifiziert sein.
Wenn in der neuen Klausel ein Entitätsklassenname angegeben ist, befinden sich die resultierenden Entitätsinstanzen im neuen Zustand.
SELECT NEW com.acme.example.CustomerDetails(c.id, c.status, o.count) FROM Customer c JOIN c.orders o WHERE o.count > 100
Kurz gesagt, verwenden Sie das ausgewählte Neu Object[]
). Unabhängig davon, ob Sie das Ergebnis einer Abfrage in einer Entitätsklasse oder einer nicht zugeordneten Klasse zuordnen, hängt von Ihrer Auswahl ab. Ein typisches Beispiel wäre ein Listenbildschirm (auf dem Sie möglicherweise nicht alle Details wünschen).
Mit anderen Worten, verwenden Sie es nicht überall, sondern verbieten Sie nicht (nur wenige Dinge sind nur schwarz oder weiß).
Andere Tipps
Sie verwenden diese Art von Abfrage oft, wenn Sie a abrufen möchten Datenübertragungsobjekt. Vielleicht kann ein Bericht ein guter Ort sein, um ihn zu verwenden. Wenn Sie nur ein einzelnes Domänenobjekt abrufen möchten (wie aus der Familie stattdessen), es gibt also keinen Grund, es zu verwenden.
Ein mit New erstellter Objekt muss kein DTO sein, dh ein Objekt, das von der Geschäftsschicht exportiert wird. Es kann auch ein Pojo -Domain -Objekt sein, dh ein internes Objekt, das intern von der Geschäftsschicht verwendet wird.
Der Grund, diese Art von Pojos als Teilobjekt anstelle der vollständigen JPA -Entität zu verwenden, ist die Leistung in bestimmten Arten von Verknüpfungen. Eine großartige Ressource, die erklärt, ist: http://use-the-index-luke.com/sql/join/hash-join-partial-objects