Domanda

Sto cercando di impostare un parametro nella mia domanda, per esempio:

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

E quando si aggiunge il parametro nel mio JavaClass è come:

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

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

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

È stato utile?

Soluzione

Si suppone di passare un elenco.

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 fissa, invece di personalizzare la stringa. I vantaggi potrebbero essere:

  1. Riduzione analisi : implementazione JPA (almeno Hibernate) hanno un duro lavoro di analisi ogni query. Quindi la query analizzato va in una cache, per essere riutilizzati. Se la stringa di query è costruire in fase di esecuzione da parametri, potrebbe non essere mai due volte lo stesso, così un sacco di tempo, potenza di calcolo e la memoria cache vengono persi. Ma se si utilizza la stessa stringa di query con parametri diversi, bingo:. Veloci, l'utilizzo della memoria bassa, bassa richiesta di cpu
  2. Prevenire SQL Injection . Questa garanzia è offerta, se si utilizzano i parametri. Se si crea la stringa di query con i parametri, è necessario fornire da soli questa garanzia ...!

Altri suggerimenti

Si deve passare in una lista di stringhe, non una singola stringa. JPA non analizza i vostri valori, è necessario dividere voi stessi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top