JPQL Créer un nouvel objet dans l'instruction Select - éviter ou embrasser?
Question
Je l'ai appris récemment qu'il est possible de créer de nouveaux objets dans les états de JPQL
comme suit:
select new Family(mother, mate, offspr)
from DomesticCat as mother
join mother.mate as mate
left join mother.kittens as offspr
Est-ce quelque chose à éviter ou plutôt d'embrasser? Quand l'utilisation de cette fonction justifiée à la lumière des bonnes pratiques?
La solution
Ne pas l'éviter , le SELECT NEW est là parce qu'il ya des cas d'utilisation parfaitement valables pour elle comme l'a rappelé dans le §10.2.7.2. JPQL Expressions Constructor dans la clause SELECT de la EJB 3.0 JPA :
Un constructeur peut être utilisé dans la liste SELECT pour retourner un ou plusieurs Java les instances. La classe spécifiée est nécessaire pour être une entité ou d'être mis en correspondance avec la base de données. le nom du constructeur doit être entièrement qualifié.
Si un nom de classe d'entité est spécifiée dans la clause SELECT NOUVEAU, la les instances de l'entité résultant sont dans la état neuf.
SELECT NEW com.acme.example.CustomerDetails(c.id, c.status, o.count) FROM Customer c JOIN c.orders o WHERE o.count > 100
En bref, utilisez le SELECT NOUVEAU quand vous ne voulez pas récupérer une entité complète ou un graphe complet d'objets dans un type moyen sûr (par opposition à un Object[]
). Que vous associez le résultat d'une requête dans une classe d'entité ou une classe non cartographié dépendra de votre sélection. Un exemple typique serait un écran de liste (où vous voudrez peut-être pas tous les détails).
En d'autres termes, ne l'utilisez pas partout mais n'empêchez pas son utilisation (peu de choses sont seulement en noir ou blanc).
Autres conseils
Vous utilisez souvent ce genre de requête lorsque vous souhaitez récupérer un Transfert de données Objet . Peut-être un rapport peut être un bon endroit pour l'utiliser. Si vous voulez juste pour récupérer un seul objet de domaine (comme de la famille au lieu), donc il n'y a aucune raison de l'utiliser.
Un objet créé avec la nouvelle ne doit pas être un DTO, à savoir un objet qui sera exporté par la couche d'affaires. Il peut aussi être un objet de domaine POJO, à savoir un objet utilisé en interne par la couche d'affaires.
La raison d'utiliser ce genre de POJO comme un objet partiel au lieu de la pleine entité JPA est la performance dans certains types de REJOINT. Une grande ressource qui explique c'est: http: // utilisation -the-index-luke.com/sql/join/hash-join-partial-objects