Assemblée parlementaire paritaire setParameter lorsqu'ils traitent avec « NOT IN (: param) »

StackOverflow https://stackoverflow.com/questions/1947323

  •  20-09-2019
  •  | 
  •  

Question

Je suis en train de définir un paramètre dans ma requête, par exemple:

select * from Cars where Cars.color NOT IN (:color_params)

Et quand j'ajoute le paramètre dans mon JavaClass est comme:

...
query.setParameter("color_params", "RED,BLUE");
...

Et cela ne fonctionne pas, ne travaille avec un seul paramètre .
Je l'ai essayé avec "'RED','BLUE'" et ne fonctionne pas à.

Si je mets mes paramètres dans la requête travaille par exemple:

select * from Cars where Cars.color NOT IN ('RED','BLUE')

Ce que je fais mal!

Merci d'avance

Était-ce utile?

La solution

Vous êtes censé passer une liste.

List<String> colors = ....;
String query = "select * from Cars where Cars.color NOT IN (:color_params)";
Map<String, Object> params = new HashMap<String, Object>();
params.put("color_params", colors);
// ... execute the query with the param.

Vous pouvez également faire:

query.setParameter("color_params", colors);

En règle générale, il est souvent préféré de passer des paramètres à une requête fixe, au lieu de personnaliser la chaîne. Les avantages peuvent être:

  1. Réduction de l'analyse syntaxique : la mise en œuvre de l'APP (au moins Hibernate) ont un travail analyse chaque requête. Ainsi, la requête va dans un analysable cache, pour être réutilisé. Si la chaîne de requête est construit à l'exécution à partir des paramètres, il pourrait ne jamais être deux fois la même chose, donc beaucoup de temps, la puissance de calcul et de mémoire cache sont perdues. Mais si vous utilisez la même chaîne de requête avec des paramètres différents, bingo:. Rapide, faible utilisation de la mémoire, une faible exigence cpu
  2. Prévenir l'injection SQL . Cette garantie est offerte si vous utilisez des paramètres. Si vous construisez votre chaîne de requête avec les paramètres, vous devez vous fournir cette garantie ...!

Autres conseils

Vous devez passer dans une liste de chaînes, pas une seule chaîne. JPA ne pas analyser vos valeurs, vous devez les séparer vous-même.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top