Critères d’Hibernate vs HQL: lequel est le plus rapide?

J’ai lu quelques anwers, mais je suis toujours confus. Pourquoi? car les différences que vous avez mentionnées ne sont pas liées à la performance. ils sont liés avec une utilisation facile (Objetc (critères) et SQL (hql)). Mais je voudrais savoir si “criteres” est plus lent que hql pour une raison quelconque.

Je lis ceci dans une autre anwers

“Il existe une différence de performances entre HQL et criteriaQuery, chaque fois que vous lancez une requête à l’aide de criteriaQuery, il crée un nouvel alias pour le nom de la table qui ne figure dans le dernier cache interrogé d’aucune DB. comstackr le SQL généré, ce qui prend plus de temps à exécuter. ” par Varun Mehta.

C’est très proche MAIS! Je lis dans un autre site Web (http://gary-rowe.com/agilestack/tag/hibernate/) Ce n’est plus le cas avec Hibernate 3.3 et supérieur (veuillez lire ceci: 9) Hibernate est lent car le SQL généré par le L’interface des critères n’est pas cohérente)

J’ai fait quelques tests pour essayer de trouver les différences, mais les deux génèrent qry et cela ne change pas l’alias à la table.

Je suis très confus. Si quelqu’un connaît la raison principale, s’il vous plaît, pourriez-vous nous aider. Merci

Je suis le gars qui a écrit le traducteur d’interrogation Hibernate 3 en 2004, alors je sais quelque chose sur son fonctionnement.

Les critères, en théorie, devraient avoir moins de surcharge qu’une requête HQL (à l’exception des requêtes nommées, auxquelles j’irai). C’est parce que les critères n’ont pas besoin d’parsingr quoi que ce soit. Les requêtes HQL sont analysées avec un parsingur ANTLR, puis l’AST résultant est transformé en SQL. Cependant, avec HQL / JPAQL, vous pouvez définir des requêtes nommées, où le SQL est généré au démarrage de SessionFactory. En théorie, les requêtes nommées ont moins de charge que les critères.

En termes de coûts de génération SQL, nous avons donc:

  1. Nommé HQL / JPAQL Query – La génération SQL ne se produit qu’une seule fois.
  2. Critères – Pas besoin d’parsingr avant de générer.
  3. (non nommé) requête HQL / JPAQL – parsing, puis génère.

Cela dit, choisir une technique de requête basée sur la surcharge de l’parsing syntaxique et de la génération SQL est probablement une erreur à mon avis. Cette surcharge est généralement très faible par rapport à l’exécution d’une requête réelle sur un serveur de firebase database réel avec des données réelles. Si cette surcharge apparaît réellement lors du profilage de l’application, vous devriez peut-être passer à une requête nommée.

Voici ce que je considère en choisissant entre critères et HQL / JPAQL:

  • Tout d’abord, vous devez décider si vous êtes d’ accord avec une dépendance à l’API propriétaire d’Hibernate dans votre code. JPA n’a pas de critères.
  • Les critères permettent vraiment de gérer de nombreux parameters de recherche optionnels tels que ceux que vous pouvez trouver sur une page Web classique avec un «formulaire de recherche» à plusieurs parameters. Avec HQL, les développeurs ont tendance à utiliser des expressions de clause where avec SsortingngBuilder ( évitez ceci! ). Avec les critères, vous n’avez pas besoin de le faire. Hardik a publié des opinions similaires.
  • HQL / JPAQL peut être utilisé pour la plupart des autres choses, car le code a tendance à être plus petit et plus facile à comprendre pour les développeurs.
  • Si vous utilisez HQL, vous pouvez transformer des requêtes très fréquentes en requêtes nommées. Je préfère le faire plus tard, après quelques profils.

Je travaille sur des millions de disques. J’ai trouvé que HQL est beaucoup plus rapide que les critères. Les critères sont beaucoup moins performants.

Si vous traitez beaucoup de données, optez pour HQL.

Autres avantages Je pense pour les critères HQL :

Ecrire HQL rend le code désordonné. Cela ne ressemble plus à écrire du code orienté object.

En écrivant des requêtes de critères, IDE nous suggère avec Intellisense, donc il y a moins de chance de commettre des erreurs, sauf lorsque nous écrivons quelque chose comme des noms de variables entre guillemets.

Je préfère surtout les requêtes de critères pour les requêtes dynamics. Par exemple, il est beaucoup plus facile d’append un ordre de manière dynamic ou de laisser certaines parties (par exemple des ressortingctions) en fonction de certains parameters.

D’autre part, j’utilise HQL pour les requêtes statiques et complexes, car il est beaucoup plus facile de comprendre / lire HQL. Je pense aussi que HQL est un peu plus puissant, par exemple pour différents types de jointure.

JPA et Hibernate – Critères vs. JPQL ou HQL

Vous avez raison et non. La liste de résultats est extraite de la firebase database ou du cache avec la classe org.hibernate.loader.Loader . Lorsque le cache n’est pas activé, l’instruction préparée est créée à l’aide de l’object Dialect créé dans SessionFactoryImp. Ainsi, les instructions sont initialisées par appel de liste. En outre, une requête de bas niveau est générée automatiquement. Fondamentalement, il s’agit d’une aide, mais il peut arriver qu’une requête spécifique soit plus efficace lorsqu’elle est écrite manuellement.