JPA setParameter при работе с «НЕ В (:param)»
-
20-09-2019 - |
Вопрос
Я пытаюсь установить параметр в своем запросе, например:
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);
Как правило, часто предпочтительнее передавать параметры в фиксированный запрос вместо настройки строки.Преимуществами могут быть:
- Уменьшенный анализ:Реализация JPA (по крайней мере, Hibernate) требует тяжелой работы по анализу каждого запроса.Таким образом, проанализированный запрос попадает в кеш для повторного использования.Если строка запроса создается во время выполнения из параметров, она может никогда не совпадать дважды, поэтому теряется много времени, вычислительной мощности и кэш-памяти.Но если вы используете одну и ту же строку запроса с разными параметрами, бинго:быстрый, низкое использование памяти, низкие требования к процессору.
- Предотвратить SQL-инъекцию.Эта гарантия предоставляется, если вы используете параметры.Если вы строите строку запроса с параметрами, вы должны предоставить себе эту гарантию...!
Другие советы
Вы должны передать список строк, а не одну строку.JPA не анализирует ваши значения, вы должны разделить их самостоятельно.
Не связан с StackOverflow