2009-12-22 8 views
7

Ich versuche, einen Parameter in meiner Anfrage zu setzen, zum Beispiel:JPA setParameter, wenn sie mit zu tun "NOT IN (: param)"

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

Und wenn ich hinzufüge, die Parameter in meinem Java ist wie:

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

Und dies nicht funktioniert, funktioniert nur mit nur einem Parameter.
Ich habe versucht mit "'RED','BLUE'" und funktioniert nicht.

Wenn ich meine Parameter in der Abfrage gestellt wird beispielsweise arbeiten:

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

Was ich falsch mache !?

Vielen Dank im Voraus

Antwort

12

Sie sollen eine Liste übergeben.

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. 

Sie könnten auch tun:

query.setParameter("color_params", colors); 

Als allgemeine Regel gilt, es bevorzugt wird oft Parameter auf eine feste Abfrage zu übergeben, anstatt den String von Customizing. Die Vorteile können sein:

  1. Reduzierte Parsing: JPA-Implementierung (zumindest Hibernate) haben eine harte Arbeit jede Abfrage Parsen. Daher wird die geparste Abfrage in einen Cache aufgenommen, um wiederverwendet zu werden. Wenn die Abfragezeichenfolge zur Laufzeit aus Parametern erstellt wird, ist sie möglicherweise nie doppelt so groß, so dass viel Zeit, Rechenleistung und Cache-Speicher verloren gehen. Aber wenn Sie die gleiche Abfragezeichenfolge mit verschiedenen Parametern verwenden, Bingo: schnell, wenig Speicherverbrauch, niedrige CPU-Anforderung.
  2. Verhindern Sie SQL-Injektion. Diese Garantie wird angeboten, wenn Sie Parameter verwenden. Wenn Sie Ihre Abfragezeichenfolge mit den Parametern erstellen, müssen Sie sich diese Garantie geben ...!
+0

Danke .... funktioniert anmutig! –

+0

KLE: Woher hast du diese 2 Kugeln? –

+1

@Castanho Die ** Bullet-Nummern 1 und 2? ** Schreiben Sie einfach "1." in einer neuen Zeile, der eine Leerzeile vorangestellt ist. [Die Zahlen werden automatisch berechnet, Sie können "1" schreiben. für alle von ihnen: Wiki-Stil]. Wenn Sie eine Frage oder Antwort schreiben, gibt es in der rechten Spalte so viele Möglichkeiten ... ;-) – KLE

1

Sie in einer Liste von Strings übergeben müssen, nicht einen einzigen String. JPA analysiert Ihre Werte nicht, Sie müssen sie selbst teilen.

+0

Danke .... funktioniert anmutig! –

Verwandte Themen