2009-12-22 11 views
7

Sto cercando di impostare un parametro nella mia domanda, per esempio:JPA setParameter quando si tratta di "NOT IN (: param)"

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

E quando si aggiunge il parametro nella mia JavaClass è come:

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

E questo non funziona, funziona solo con solo parametro.
Ho provato con "'RED','BLUE'" e non funziona.

Se metto i miei parametri nella query sta lavorando ad esempio:

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

quello che sto facendo male !?

Grazie in anticipo

risposta

12

Si suppone che si passi 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. 

Si potrebbe anche fare:

query.setParameter("color_params", colors); 

Come regola generale, è spesso preferito per passare parametri a una query fisso, invece di personalizzare la stringa. I vantaggi potrebbero essere:

  1. ridotto analisi: implementazione JPA (almeno Hibernate) hanno un duro lavoro di analisi ogni query. Quindi la query analizzata entra in una cache, da riutilizzare. Se la stringa di query viene creata in fase di runtime dai parametri, potrebbe non essere mai due volte uguale, quindi si perde molto tempo, potenza di calcolo e memoria cache. Ma se si utilizza la stessa stringa di query con parametri diversi, bingo: uso veloce, memoria insufficiente, requisito di CPU basso.
  2. Prevenzione dell'iniezione SQL. Questa garanzia è offerta se si utilizzano i parametri. Se costruisci la tua stringa di query con i parametri, devi fornirti questa garanzia ...!
+0

Grazie .... funziona con grazia! –

+0

KLE: da dove hai preso questi 2 proiettili? –

+1

@Castanho I ** numeri di riferimento 1 e 2? ** Basta scrivere '1' su una nuova riga, preceduta da una linea vuota. [I numeri sono calcolati automaticamente, puoi scrivere '1' per tutti loro: stile Wiki]. Quando scrivi una domanda o una risposta, la colonna di destra ti offre così tante opzioni ... ;-) – KLE

1

si deve passare in una lista di stringhe, non una singola stringa. JPA non analizza i tuoi valori, devi dividerli tu stesso.

+0

Grazie .... funziona con garbo! –

Problemi correlati