2009-12-22 22 views
7

Estoy tratando de establecer un parámetro en mi consulta, por ejemplo:APP setParameter cuando se trata de "NO EN (: param)"

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

Y cuando estoy añadiendo el parámetro es en mi JavaClass como:

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

Y esto no está funcionando, sólo se está trabajando con sólo un parámetro.
Lo he intentado con "'RED','BLUE'" y no está funcionando.

Si pongo mis parámetros en la consulta está trabajando, por ejemplo:

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

lo que estoy haciendo mal !?

Gracias de antemano

Respuesta

12

Se supone que debes pasar una lista.

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. 

También podría hacer:

query.setParameter("color_params", colors); 

Como regla general, a menudo es preferido para pasar parámetros a una consulta fijo, en lugar de la personalización de la cadena. Las ventajas podrían ser:

  1. reducido análisis: implementación de JPA (al menos Hibernate) tienen un duro trabajo de análisis de cada consulta. Entonces, la consulta analizada entra en un caché, para ser reutilizado. Si la cadena de consulta se construye en tiempo de ejecución a partir de parámetros, es posible que nunca sea el doble, por lo que se pierde mucho tiempo, potencia de cálculo y memoria caché. Pero si usa la misma cadena de consulta con diferentes parámetros, bingo: rápido, bajo uso de memoria, bajo requerimiento de CPU.
  2. Prevenir la inyección SQL. Esta garantía se ofrece si usa parámetros. Si construyes tu cadena de consulta con los parámetros, ¡tienes que proporcionarte esta garantía ...!
+0

Gracias .... funciona con gracia! –

+0

KLE: ¿de dónde sacaste estas 2 balas? –

+1

@Castanho ** números de viñeta 1 y 2? ** Simplemente escriba '1.' en una nueva línea, precedida por una línea vacía. [Los números se calculan automáticamente, puede escribir '1' para todos ellos: estilo Wiki]. Al escribir una pregunta o respuesta, la columna de la derecha le da tantas opciones ... ;-) – KLE

1

debe pasar una lista de cadenas, ni una sola cadena. JPA no analiza sus valores, debe dividirlos usted mismo.

+0

Gracias .... funciona con gracia! –

Cuestiones relacionadas