JPA setParameter при работе с "NOT IN (: param)" - PullRequest
7 голосов
/ 22 декабря 2009

Я пытаюсь установить параметр в своем запросе, например:

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

И когда я добавляю параметр в мой JavaClass, это выглядит так:

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

И это не работает, работает только с только одним параметром .
Я пробовал с "'RED','BLUE'" и не работает до.

Если я поставлю свои параметры в запросе, работает, например:

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

Что я делаю не так!?

Заранее спасибо

Ответы [ 2 ]

13 голосов
/ 22 декабря 2009

Вы должны передать список.

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.

Вы также можете сделать:

query.setParameter("color_params", colors);

Как правило, часто предпочтительнее передавать параметры в фиксированный запрос, а не настраивать строку. Преимущества могут быть:

  1. Сокращенный синтаксический анализ : реализация JPA (по крайней мере, Hibernate) выполняет тяжелую работу по анализу каждого запроса. Таким образом, проанализированный запрос помещается в кэш для повторного использования. Если строка запроса формируется во время выполнения из параметров, она может никогда не совпадать дважды, поэтому теряется много времени, вычислительной мощности и кэш-памяти. Но если вы используете одну и ту же строку запроса с разными параметрами, bingo: быстро, мало памяти, низкое требование к процессору.
  2. Запретить внедрение SQL . Эта гарантия предоставляется, если вы используете параметры. Если вы строите строку запроса с параметрами, вы должны предоставить себе эту гарантию ...!
1 голос
/ 22 декабря 2009

Вы должны передать список строк, а не одну строку. JPA не анализирует ваши значения, вы должны разделить их самостоятельно.

...