2009-12-22 4 views
7

Je suis en train de définir un paramètre dans ma requête, par exemple:JPA setParameter lorsqu'ils traitent avec « NOT IN (: param) »

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

Et quand je suis en ajoutant 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.
J'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 à l'avance

Répondre

12

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 pourraient être:

  1. réduit parsing: mise en œuvre de l'APP (au moins Hibernate) ont un travail analyse chaque requête. La requête analysée entre donc dans un cache pour être réutilisée. Si la chaîne de requête est créée à l'exécution à partir de paramètres, elle peut ne jamais être deux fois la même, ce qui fait perdre beaucoup de temps, de puissance de calcul et de mémoire cache. Mais si vous utilisez la même chaîne de requête avec des paramètres différents, bingo: rapide, utilisation de la mémoire faible, faible exigence CPU.
  2. Empêcher 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 ...!
+0

Merci .... fonctionne gracieusement! –

+0

KLE: d'où avez-vous eu ces 2 balles? –

+1

@Castanho Les ** numéros de balle 1 et 2? ** Il suffit d'écrire «1». sur une nouvelle ligne, précédée d'une ligne vide. [Les nombres sont calculés automatiquement, vous pouvez écrire '1'. pour chacun d'entre eux: style Wiki]. Lorsque vous écrivez une question ou une réponse, la colonne de droite vous donne autant d'options ... ;-) – KLE

1

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

+0

Merci .... fonctionne gracieusement! –