создание разделенной запятыми строки, которая будет передана в качестве ввода в предложение sq "IN" - PullRequest
2 голосов
/ 04 января 2011

Я хочу, чтобы в качестве входных данных для предложения SQL "IN" была задана строка, в которой я хочу получить список строк, разделенных запятыми

Ответы [ 6 ]

3 голосов
/ 04 января 2011

Вы можете использовать гуава Joiner:

Joiner.on(",").join(inputsList);
2 голосов
/ 04 января 2011

Вы должны использовать PreparedStatement , чтобы ваши строки при необходимости автоматически экранировались и вы были защищены от внедрения SQL.

Сначала создайте оператор с маркером для каждого элемента всписок.Например:

select id, name from users where name in (?, ?, ?)

Затем прокрутите список и задайте значения в выражении.

Для получения более подробной информации взгляните на этот вопрос:

Чтонаилучший подход с использованием JDBC для параметризации предложения IN?

1 голос
/ 04 января 2011

Это делает работу:

public String separateByComma(List<String> input) {

   // check for valid input!!

   public StringBuilder sb = new StringBuilder(input.get(0));
   for (int i = 1; i < input.size(); i++)
     sb.append(",").append(input.get(i));

   return sb.toString();
}

Кстати - вам могут понадобиться строки, заключенные в двойные кавычки:

public String separateByCommaForSQL(List<String> input) {

   // check for valid input!!

   public StringBuilder sb = new StringBuilder("\""+input.get(0)+ "\"");
   for (int i = 1; i < input.size(); i++)
     sb.append(",\"").append(input.get(i)).append("\"");

   return sb.toString();
}
0 голосов
/ 04 января 2011

Необычное решение: если строки находятся в ArrayList или LinkedList (подкласс java.util.AbstractCollection), вызовите toString(), который возвращает " [e1, e2, e3 ...] ». Тогда вы можете обработать строку.

0 голосов
/ 04 января 2011

Как указывают другие ответы, есть много помощников, которых вы можете использовать для присоединения.

Я хотел бы добавить предупреждение:

Имейте в виду, что большинство СУБД имеют верхний предел количества значений, которые вы можете объединить следующим образом. Мы сталкивались с этим раньше; если вы не уверены, что у вас никогда не будет больше нескольких десятков значений или около того, вы должны убедиться, что вы не превышаете этот предел (который отличается для каждой СУБД, иногда даже настраивается).

Ограничение обычно исходит либо из ограничения на общий размер оператора SQL, либо из явного ограничения на число значений в списке через запятую.

Если вы столкнетесь с этой проблемой, альтернативой будет создание временной (или постоянной) таблицы для списка значений и INSERT ваших значений в эту таблицу. Тогда вы можете использовать WHERE xxx IN (SELECT column FROM helpertable) вместо помещения списка в оператор SQL. Это позволяет избежать проблемы максимальной длины; это также, вероятно, быстрее, если вам нужно повторно использовать список. Это больше хлопот (и, вероятно, медленнее), если вам нужен список только один раз, хотя ...

0 голосов
/ 04 января 2011

Вы можете использовать org.apache.commons.lang.StringUtils.join () или реализовать операцию соединения самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...