Requêtes avec paramètres

Disponible

4.1 Paramètres des requêtes

Hibernate vous permet de passer des paramètres aux requêtes. Ainsi, tout le travail avec les requêtes et la base de données est grandement simplifié.

Il est très rare de trouver des requêtes immuables. Au début, il semble que vous n'ayez qu'à renvoyer une liste de marchandises de la base de données. Et puis il s'avère que vous avez besoin d'une liste de produits à jour pour un utilisateur spécifique à une date précise. Trié par le champ requis, et pas encore toute la liste, mais une page spécifique : par exemple, les produits de 21 à 30.

Et c'est exactement ce que résolvent les requêtes paramétrées. Vous écrivez une requête en HQL, puis vous remplacez les valeurs modifiables par des "noms spéciaux" - paramètres. Et puis séparément lors de l'exécution de la requête, vous pouvez passer les valeurs de ces paramètres.

Écrivons une requête HQL qui renverra toutes les tâches d'un utilisateur avec un nom spécifique :

from EmployeeTask where employee.name = "Ivan Ivanovich"

Remplaçons maintenant le nom par un paramètre :

from EmployeeTask where employee.name = :username

Et voici à quoi ressemblera notre code Java pour trouver des tâches :

String hql = "from EmployeeTask where employee.name = :username";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameter("username", "Ivan Ivanovich");
List<EmployeeTask> resultLIst = query.list();

De plus, au lieu d'un nom de paramètre, vous pouvez utiliser uniquement un nombre :

String hql = "from EmployeeTask where employee.name = :1";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameter(1, "Ivan Ivanovich");
List<EmployeeTask> resultLIst = query.list();

Bien qu'il soit préférable, bien sûr, d'utiliser le nom, il est beaucoup plus facile de lire et de maintenir un tel code.

4.2 Méthode setParameterList().

Il existe également des cas où la valeur du paramètre n'est pas un, mais représente une liste d'objets. Par exemple, nous voulons vérifier que les professions des employés sont contenues dans une certaine liste.

Comment cela pourrait-il être fait:


String hql = "from EmployeeTask where occupation IN (:occupation_list)";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameterList("occupation_list", new String[] {"Programmer", "Tester"});
List<EmployeeTask> resultLIst = query.list();

4 types de liste peuvent être passés en valeur de paramètre :

  • tableau d'objets : Objet[]
  • collecte : collecte
  • tableau typé : T[]
  • collection typée : Collection<T>

Si vous décidez de transmettre une collection ou un tableau typé, vous devez transmettre le type de données comme troisième paramètre. Exemple:


String hql = "from EmployeeTask where occupation IN (:occupation_list)";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameterList("occupation_list", new String[] {"Programmer", "Tester"}, String.class);
List<EmployeeTask> resultLIst = query.list();

Lorsque vous travaillez avec des paramètres de liste, vous pouvez également utiliser un nombre au lieu du nom du paramètre. Mais encore une fois, le nom est plus pratique.

4.3 Protection contre l'injection SQL

L'un des objectifs les plus importants des paramètres est de protéger la base de données des injections SQL. De nombreux programmeurs novices, au lieu d'utiliser des paramètres, colleraient simplement une chaîne de plusieurs parties.

Au lieu d'écrire comme ça :

String hql = "from EmployeeTask where employee.name = :username";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameter("username", "Ivan Ivanovich");
List<EmployeeTask> resultLIst = query.list();

Écrirait comme ceci:

String hql = "from EmployeeTask where employee.name = " + "Ivan Ivanovich";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
List<EmployeeTask> resultLIst = query.list();

Ne fais jamais cela!Ne collez jamais une requête SQL/HQL à partir de plusieurs parties. Parce que tôt ou tard, le nom d'utilisateur vous viendra du client. Et le hacker diabolique vous donnera une chaîne comme""Ivan"; DROP TABLE user;"

Et puis votre requête à la base de données prendra la forme :

from EmployeeTask where employee.name = "Ivan"; DROP TABLE user;

Et c'est toujours bien si vos données sont simplement supprimées. Vous pouvez aussi écrire comme ceci :

from EmployeeTask where employee.name = "Ivan";
UPDATE user SET password = '1' WHERE user.role = 'admin'

Ou comme ceci :

from EmployeeTask where employee.name = "Ivan";
UPDATE user SET role = 'admin' WHERE user.id = 123;
Commentaires
  • Populaires
  • Nouveau
  • Anciennes
Tu dois être connecté(e) pour laisser un commentaire
Cette page ne comporte pas encore de commentaires