Вопрос

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

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')

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

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

Это было полезно?

Решение

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

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) требует тяжелой работы по анализу каждого запроса.Таким образом, проанализированный запрос попадает в кеш для повторного использования.Если строка запроса создается во время выполнения из параметров, она может никогда не совпадать дважды, поэтому теряется много времени, вычислительной мощности и кэш-памяти.Но если вы используете одну и ту же строку запроса с разными параметрами, бинго:быстрый, низкое использование памяти, низкие требования к процессору.
  2. Предотвратить SQL-инъекцию.Эта гарантия предоставляется, если вы используете параметры.Если вы строите строку запроса с параметрами, вы должны предоставить себе эту гарантию...!

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top