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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top