Quoi utiliser: JPQL ou Criteria API?

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

    Je suis sûr que cela a déjà été couvert ici sur SO mais je n’ai pas trouvé la question existante. Donc, voici mon sharepoint vue sur la question:

    • Je trouve que les requêtes JPQL sont plus faciles à écrire / lire.
    • Je trouve que l’API Criteria est agréable pour créer des requêtes dynamics.

    Ce qui est fondamentalement ce que vous trouverez dans Hibernate: Criteria vs. HQL .

    Mais il y a une différence majeure entre l’API Critères JPA 2.0 et l’API Critères d’Hibernate qui mérite d’être mentionnée: l’API Critères JPA 2.0 est une API typeafe qui permet de comstackr les temps, de compléter le code, de mieux prendre en charge le refactoring, etc. ne trouvez pas que les avantages l’emportent sur la facilité d’utilisation de JPQL.

    En résumé, je privilégierais JPQL, sauf pour les requêtes dynamics (par exemple pour les fonctions de recherche multi-critères).

    Questions connexes

    • Hibernate: Critères vs. HQL
    • Quels sont les exemples réels où l’API JPA2 Criteria est plus préférable?

    Davantage de ressources

    • Hibernate Querying 102: API de critères

    J’ai déjà répondu à une question similaire et je publierai ma réponse ici pour le bénéfice de la communauté. Je suppose que vous utilisez un serveur d’applications face à ma réponse ci-dessous.

    L’API Criteria existe pour permettre la construction de requêtes SQL dynamics d’une manière sécurisée qui empêche l’injection SQL. Sinon, vous concaténeriez des chaînes SQL qui sont à la fois source d’erreurs et de risques de sécurité: par exemple, l’injection SQL. Ce serait la seule fois que vous souhaiteriez utiliser l’API Criteria.

    Si la requête rest fondamentalement la même mais ne nécessite que des parameters différents, vous devez utiliser des @NamedQueries annotées plus simples, précompilées, pouvant être mises en cache dans le cache secondaire et éventuellement validées lors du 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 requirejse.

    J’espère que cela t’aides.

    Je pense que vous pouvez également envisager un autre nouveau cadre comme:

    Interroger Dsl

    Requête d’object

    Requête torpille

    Cela vous donne un moyen sûr et intelligent de créer des requêtes, n’est pas standard, mais je suis certain que la prochaine norme sera basée sur l’une de ces technologies.

    si vous voulez restr sur les normes ignorer cela.

    au revoir