web-dev-qa-db-fra.com

Quoi utiliser: API JPQL ou Criteria?

Mon Java utilise JPA pour la persistance des objets. Le domaine métier est très simple (seulement trois classes sont persistantes, avec 3-5 propriétés dans chacune). Les requêtes sont également simples. La question est quelle approche utiliser: JPQL ou Criteria API?

65
yegor256

Je suis presque sûr que cela a déjà été abordé ici sur SO mais je n'ai pas pu trouver la question existante. Donc, voici mon point de vue sur la question:

  • Je trouve que les requêtes JPQL sont plus faciles à écrire/lire.
  • Je trouve l'API Criteria sympa pour construire des requêtes dynamiques.

C'est essentiellement ce que vous trouverez dans Hibernate: Criteria vs. HQL .

Mais il y a une différence majeure entre l'API JPA 2.0 Criteria et l'API Hibernate's Criteria qui mérite d'être mentionnée: l'API JPA 2.0 Criteria est une API sécurisée et donne donc des vérifications de temps de compilation, l'achèvement du code, un meilleur support de refactoring, etc. Cependant, [~ # ~] i [~ # ~] ne trouve pas que les avantages l'emportent sur la facilité d'utilisation de JPQL.

Pour résumer, je préférerais JPQL, sauf pour les requêtes dynamiques (par exemple pour les fonctionnalités de recherche multicritères).

Questions connexes

Davantage de ressources

74
Pascal Thivent

J'ai répondu à une question similaire précédemment et je publierai ma réponse ici pour le bénéfice de la communauté. Je vais supposer que vous utilisez un serveur d'applications par rapport à ma réponse ci-dessous.

L'API Criteria existe pour permettre la construction de requêtes SQL dynamiques d'une manière sécurisée qui empêche l'injection SQL. Sinon, vous concaténeriez des chaînes SQL ensemble, ce qui est à la fois sujet aux erreurs et à un risque de sécurité: c'est-à-dire injection SQL. Ce serait la seule fois où vous voudriez utiliser l'API Criteria.

Si la requête reste fondamentalement la même mais ne doit accepter que des paramètres différents, vous devez utiliser des @NamedQueries annotées qui sont plus simples, précompilées, peuvent être mises en cache dans le cache secondaire et éventuellement validées au démarrage du serveur.

C'est essentiellement la règle de base concernant les requêtes de critères par rapport à @NamedQueries. D'après mon expérience, vous avez rarement besoin de l'API Criteria, mais il est bon qu'elle existe pour les rares fois où elle est requise.

J'espère que cela t'aides.

4
sagneta