Преобразование списка в строку в java для Oracle SQL В предложении

#java #list #rest #clause

#java #Список #отдых #оговорка

Вопрос:

У меня есть приведенный ниже список

 ArrayList<String> list1=new ArrayList<String>();
list1.add("abc");
list1.add("bdc");
list1.add("acr");
list1.add("bde");
 

Я хотел использовать этот список в запросе выбора, как показано ниже

 select * from emp where emp_name in ('abc','bdc','acr','bde')
 

Я использую шаблон spring boot rest и попробовал использовать ArrayList paramsList =new ArrayList(), но это не удалось. Есть ли простой способ сделать это вместо преобразования в строку с помощью итерации?

Комментарии:

1. Предупреждение: код подвержен атакам SQL-инъекций и синтаксическим ошибкам SQL. Не создавайте SQL, используя конкатенацию строк с текстовыми значениями неопределенного происхождения. Используйте маркеры a PrepareStatement и parameter.

Ответ №1:

Вы можете объединить строки в списке, чтобы получить то, что вы хотите:

 String values = list1.stream().map(str -> String.format("'%s'", str)).collect(Collectors.joining(","));
 

И создайте запрос следующим образом:

 "select * from emp where emp_name in ("  values  ")";
 

Однако, как указал @Andreas, этот подход подвержен атакам SQL-инъекций и синтаксическим ошибкам (если значения в списке содержат зарезервированные ключевые слова SQL или специальные символы). Следовательно, вы должны использовать подготовленные операторы вместо объединения строк, подобных этому.

Комментарии:

1. Предупреждение: код подвержен атакам SQL-инъекций и синтаксическим ошибкам SQL.

2. Правильно. Вот почему я упомянул об использовании prepared statements вместо этого.

3. Да, но вы не сказали, почему или насколько опасно этого не делать.