6
votes

Hibernate nommé hql requis (en annotations) est-il optimisé?

Un nouveau collègue vient de suggérer d'utiliser des requêtes nommées HQL dans Hibernate avec des annotations (c'est-à-dire à la place de l'intégration de HQL dans nos classes XXXXXRepository.

Ce que j'aimerais savoir, c'est si l'utilisation de l'annotation fournit un avantage à l'exception des requêtes centralisées?

En particulier, existe-t-il des performances de gain, par exemple parce que la requête n'est qu'une fois analysée une fois lorsque la classe est chargée plutôt que chaque fois que la méthode du référentiel est exécutée?


1 commentaires

et je préfère les requêtes de critères aux deux ...


4 Réponses :


8
votes

de Pro EJB 3 (Mike Keith):

"... Nous vous recommandons des requêtes nommées chaque fois que cela est possible. Les prestataires de persistance prendront souvent des mesures pour précompiler JPQL nommé requis sur SQL dans le cadre de la phase de déploiement ou d'initialisation d'une application."

Bien que ce livre soit sur la JPA, le conseil général s'applique à l'hibernation. Cependant, étant donné que Hibernate Caches a analysé HQL / JPQL, vous ne verrez probablement pas un grand gain de performance. Un autre avantage de l'utilisation de requêtes nommées est qu'il vous donne la possibilité de remplacer une requête à l'aide d'un fichier de mappage au moment du déploiement sans avoir à reconstruire votre application; utile si vous avez besoin de modifier une requête en production.


0 commentaires

5
votes

Outre tout gain de performance possible, je pense qu'un autre avantage serait qu'en utilisant des requêtes HQL avec des annotations, vous pouvez vous protéger des attaques d'injection SQL.

Pour une application Web, cela est important si la requête contient des données d'entrée utilisateur.

http://fr.wikipedia.org/wiki/sql_injection


0 commentaires

3
votes

Le commentaire de Lars concernant l'injection SQL est potentiellement trompeur, même si je ne pense pas que c'était son intention, et je voulais fournir un peu plus de contexte pour que le commentaire ne soit pas mal compris.

Il est vrai que les requêtes nommées sont paramétrées par des spécifications et l'utilisation de paramètres nommés est une étape de protection contre l'injection SQL. Cependant, il ne protège pas complètement de l'injection SQL (reportez-vous à son lien pour plus). Le libellé du commentaire suggère que l'utilisation de requêtes nommées est la seule étape nécessaire à la protection contre les attaques d'injection. En réalité, des requêtes normales peuvent (et doivent) être paramétrées et fourniront exactement le même niveau d'isolation de l'attaque d'injection comme des requêtes nommées et paramétriser vos requêtes n'est qu'une des étapes nécessaires dans les attaques d'injection contrariant.

ajouter à Lars 'commentaire sur les webapps, notez qu'il est important de nettoyer les données de protection contre les attaques d'injection, que l'application soit confrontée ou non, ni si les données d'entrée proviennent d'un utilisateur ou d'une autre base de données (ou même la même base de données).


0 commentaires

2
votes

Personnellement, je pense que le gain de performance est moins important que le fait que vos requêtes de HQL sont analysées lors du démarrage du serveur, vous fournissant des messages instantanés si votre requête HQL est fausse.

Je préfère attraper ces erreurs avant de tester au lieu de.

La dernière fois, pendant les tests, je suis venu sur une requête dans le code qui n'a pas fonctionné, n'avait en fait jamais travaillé, à cause du boîtier. Cela aurait immédiatement apparent lors du démarrage du serveur, lors de l'utilisation de requêtes nommées.

et, bien sûr, je n'aime pas avoir mon hql mélangé au code Java.


0 commentaires