Frage

Ich versuche, einen Parameter in meiner Anfrage zu setzen, zum Beispiel:

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

Und wenn ich die Parameter in meinem Java bin hinzuzufügen, ist wie:

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

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

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

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

Was mache ich falsch!?

Vielen Dank im Voraus

War es hilfreich?

Lösung

Sie sollen eine Liste zu ü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önnen auch tun:

query.setParameter("color_params", colors);

In der Regel ist es oft bevorzugt Parameter auf eine feste Abfrage zu übergeben, anstatt den String von Customizing. Die Vorteile können sein:

  1. Reduzierte Parsing : JPA-Implementierung (zumindest Hibernate) hat eine harte Arbeit jede Abfrage Parsen. So ist die geparste Abfrage in einen Cache geht, wiederverwendet werden. Wenn die Abfrage-String aus Parameter Build zur Laufzeit ist, kann es nie zweimal das gleiche sein, so viel Zeit, Rechenleistung und Cache-Speicher verloren gehen. Aber wenn Sie verwenden die gleiche Abfrage-String mit unterschiedlichen Parametern, Bingo. Schnell, geringer Speicherverbrauch, niedrige CPU-Anforderung
  2. Prevent SQL-Injection . Diese Garantie wird angeboten, wenn Sie Parameter verwenden. Wenn Sie Ihre Abfrage-String mit den Parametern aufzubauen, müssen Sie sich diese Garantie bieten ...!

Andere Tipps

Sie müssen in einer Liste von Strings übergeben, nicht einen einzelnen String. JPA hat Ihre Werte nicht analysieren können, müssen sie sich teilen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top