JPA pourquoi utiliser createNamedQuery
Je suis dans le processus de changer ma couche DAO de l'utilisation de l'API Hibernate à l'aide d'un pur JPA implémentation de l'API. Il ressemble à la méthode recommandée est d'utiliser le createNamedQuery de l'entité gestionnaire. Les requêtes nommées sont stockées dans les annotations dans le modèle, les classes d'entité. Ce tout simplement pas de sens pour moi. Pourquoi définir la JPA des Requêtes dans les objets de modèle, mais de les utiliser dans les DAOs. Ne serait-il pas plus logique de l'utiliser juste createQuery de l'intérieur de la DAO lui-même et de définir les requêtes dans le DAO ou même simplement de définir les requêtes nommées dans le DAO de lui-même?
Pour ceux d'entre vous qui ont mis en œuvre votre DAO calque à l'aide de l'API JPA comment avez-vous défini vos requêtes?
OriginalL'auteur Ruggs | 2009-05-07
Vous devez vous connecter pour publier un commentaire.
- Je utiliser des requêtes nommées.
Il y a deux raisons à cela:
J'ai oublié de mentionner que ces requêtes nommées en général, je mis sur l'entité. Si la requête traverse plusieurs entités que vous venez de choisir la plus pertinente.
OriginalL'auteur
Vous pouvez prendre un coup d'oeil à Spring Data JPA. Il vous permet simplement de définir une interface et d'exécuter des requêtes sans la nécessité de mettre en œuvre l'exécution manuellement.
Entité:
Référentiel:
De l'installation:
Comme vous le voyez, vous pouvez choisir entre différentes manières de tirer la requête à exécuter à partir de la méthode. Tout en le dérivant directement à partir du nom de la méthode est faisable pour les requêtes simples, vous devriez probablement choisir entre le
@NamedQuery
JPA (standard) ou@Query
(Spring Data JPA annotation) dependening sur la façon dont beaucoup vous l'aimez, pour coller avec les normes.Spring Data JPA vous donne un soutien dans divers autres coins de la couche d'accès aux données de mise en œuvre, permet de fournir des implémentations personnalisées pour les méthodes et joliment intègre avec le Printemps.
La question est "Pour ceux d'entre vous qui ont mis en œuvre votre DAO calque à l'aide de l'API JPA comment avez-vous défini vos requêtes?" et je voulais juste faire remarquer une solution réalisable. Hadès offre une meilleure alternative accessible à l'aide de la plaine de l'EntityManager et est basé sur la plaine de la JPA, donc je ne reçois pas votre point.
Je pense que Oliver réponse et le raisonnement est bien justifié. Personnellement, je pense que son exemple de l'Hadès est très intéressant et répond à la question. En fait, je pense que je vais avoir un regard plus approfondi dans le cadre... 🙂
OriginalL'auteur
J'avais de l'expérience complètement opposé à celui de cletus - je n'ai trouvé aucun avantage et également trouvé difficile à utiliser. Trivial requêtes ne ferait aucune différence où à définir, mais non négligeable requêtes sont généralement difficiles à associer avec une seule entité, mais facile avec axés sur les affaires de la méthode.
Si vous utilisez plus ou moins sophistiqués de l'infrastructure dans DAOs (à des fins de réutilisation et de la cohérence), puis l'utilisation de requêtes nommées ont tendance à compliquer la mise en œuvre et la lisibilité sans bénéfice évident pour offrir.
La validation des requêtes par le processus de génération de sons intéressant - j'aimerais en savoir plus à ce que cela signifie vraiment... Mes requêtes laisser peu de marge d'erreur, car chaque méthode DAO est l'objet de tests unitaires autant que cela a du sens.
La validation est en fait assez agréable. J'utilise eclipse pour mon développement et, lorsque j'ai écrit un couple de requêtes, j'ai quitté le mot-clé off et j'ai reçu des erreurs lors de la compilation.
Je dois ajouter que je n'ai pas l'habitude d'utiliser pour trivial requêtes (par exemple "select p de Partie p where nom = :nom de"), juste les questions plus complexes.
OriginalL'auteur
Ne pas simplement utiliser des requêtes nommées partout, il y a des cas où ils ne sont pas appropriés, comme quand sa vas être rarement utilisé des requêtes, il peut être plus efficace quand il est construit sur la base selon les besoins.
Requêtes nommées plus de sens quand sa va être complexe, et ont été exécutés fréquemment.
[Mise à jour]
Vous pouvez écrire des requêtes nommées à la cartographie, à la place.
Les requêtes nommées sont analysées une fois et pour toujours. De sorte, que si nous écrivons une mauvaise requête, il déclenche une exception tout de suite. Les requêtes que vous créez dans le code sont analysés tous le temps sauf en cache.
Par la manière, étant donné le lien suggère la même chose. oracle.com/technology/products/ias/toplink/doc/1013/main/_html/...
OriginalL'auteur
Embrasser la puissance de et 🙂 Si vous avez une requête qui fait sens pour les mettre dans le modèle, le faire. Si vous ne le faites pas, ne le faites pas.
Il pourrait être encore mieux de poser la question "Pourquoi écrivez-vous de DAO avec JPS?" Si la réponse est "d'Isoler mon code à partir de la base de données." Ceci est effectué par la bibliothèque de la mise en œuvre de JPA. Si la réponse est "pour isoler mon code de changements à la façon dont je persiste choses", puis JPA n'est qu'en vous permettant d'avoir des implémentations différentes.
J'utilise des objets de requête pour des requêtes complexes, et toujours utilisé des requêtes nommées, si possible, et j'aime le fait que les requêtes nommées compilé, et j'ai donc trouver des bogues que beaucoup plus rapide. Je n'ai pas de couche DAO.
OriginalL'auteur