JPQL Erstellen Sie ein neues Objekt in der Auswahlanweisung - Vermeiden Sie oder umarmen Sie?

StackOverflow https://stackoverflow.com/questions/2355728

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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top