JPA Named Queries vs Criteria API?

Existe-t-il un ensemble heuristique/de bonnes pratiques/de règles pour une décision entre les critères API et NamedQuery?

Mes pensées jusqu'à présent :

Requêtes nommées sont généralement plus lisible. Les requêtes de critères sont plus flexibles.

Les deux sont précompilés. J'ai tendance à utiliser les requêtes nommées aussi longtemps que possible, puis à changer de critère.



Mais peut-être l'envie de "flexifier" la requête en utilisant les critères L'API est-elle une indication de la conception sous-optimale (c.-à-d. la séparation des préoccupations)?

Merci

26
demandé sur kostja 2011-09-07 16:42:53

5 réponses

les requêtes nommées sont plus optimales (elles sont analysées/préparées une fois). Les requêtes de critères sont dynamiques (elles ne sont pas précompilées, bien que certains fournisseurs JPA tels que EclipseLink maintiennent un cache de préparation de critères).

j'utiliserais des critères uniquement pour les requêtes dynamiques.

33
répondu James 2011-09-07 13:17:12

les requêtes de critères sont un bon choix lorsqu'une requête doit être générée dynamiquement, en se basant par exemple sur des critères de recherche variables et multiples.

pour les requêtes statiques, JPQL est beaucoup plus lisible, et je préfère les utiliser que les requêtes de critères. Vous pourriez perdre un peu de sécurité, mais les tests de l'unité devraient vous rendre plus confiant.

10
répondu JB Nizet 2011-09-07 12:47:02

un autre point de vue est que bien que la requête de critères ne soit pas aussi lisible, elle est typesafe, donc vous fournit la vérification de type de temps de compilation. Si vous changez la base de données dans des projets où il y a beaucoup d'entités et de requêtes, il est vraiment utile de voir au moment de la compilation quelles requêtes ont mal tourné à cause du changement.

d'un autre côté, Je ne suis pas sûr que ce soit plus bénéfique que la simplicité de JPQL

4
répondu illEatYourPuppies 2012-07-31 08:13:09

en fait, j'ai parcouru les sources Hibernate (4.3.0-SNAPSHOT) et EclipseLink (2.5.0-SNAPSHOT) et j'ai regardé l'implémentation de JPA dans chacune.

EclipseLink n'est clairement pas sûr du fil de la manière que vous décrivez. Spécifiquement, il tente de recalculer les jointures à plusieurs reprises.

la mise en œuvre D'Hibernate me semble sans danger. Je ne suis pas sûr à 100%, mais il semble l'être. Je dirais que ce n'est pas garanti pour être vrai à l'avenir puisqu'il n'est pas spécifié.

Toutefois, je vous préviens, je ne pense pas que vous allez gagner beaucoup. De ce que je regarde, une grande partie de la compilation de la requête est en fait faite pendant la phase "createQuery" de sorte que vous ne gagneriez même pas beaucoup de cache des résultats.

2
répondu Yinzara 2014-03-16 03:37:37

JPA fournit également un moyen de construire des requêtes statiques, comme les requêtes nommées, en utilisant les annotations @NamedQuery et @NamedQueries. Il est considéré comme une bonne pratique dans le JPA de préférer les requêtes nommées aux requêtes dynamiques lorsque cela est possible. À partir de http://www.objectdb.com/java/jpa/query/api

1
répondu José Roberto Ramírez Aguilar 2014-06-06 16:36:52