PreparedStatement со списком параметров в В пункте [дубликат]

Этот вопрос уже имеет ответ здесь:

Как к установленному значению для в пункте в preparedStatement в JDBC при выполнении запроса.

Пример:

connection.prepareStatement("Select * from test where field in (?)");

Если это в пункте может содержать несколько значений, как я могу сделать это. Иногда я знаю список параметров заранее, или иногда я не знаю заранее. Как обработать этот случай?

83
задан Brian Webster 29 September 2012 в 12:26
поделиться

4 ответа

Мне нужно добавить знак "?" для каждого возможного значения.

Например:

List possibleValues = ... 
StringBuilder builder = new StringBuilder();

for( int i = 0 ; i < possibleValue.size(); i++ ) {
    builder.append("?,");
}

String stmt = "select * from test where field in (" 
               + builder.deleteCharAt( builder.length() -1 ).toString() + ")";
PreparedStatement pstmt = ... 

И затем успешно установите параметры

int index = 1;
for( Object o : possibleValue ) {
   pstmt.setObject(  index++, o ); // or whatever it applies 
}
86
ответ дан 24 November 2019 в 08:51
поделиться

Что вы можете сделать, так это динамически построить строку select (часть 'IN (?)') с помощью простого цикла for, как только вы узнаете, сколько значений вам нужно поместить в предложение IN. Затем вы можете инстанцировать PreparedStatement.

2
ответ дан 24 November 2019 в 08:51
поделиться

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

7
ответ дан 24 November 2019 в 08:51
поделиться

Вы можете проверить эту ссылку:

http: //www.javaranch .com / journal / 200510 / Journal200510.jsp # a2

В нем объясняются плюсы и минусы различных методов создания PreparedStatement с в пункте .

РЕДАКТИРОВАТЬ:

Очевидным подходом является динамическое создание символа '?' часть во время выполнения, но я не хочу просто предлагать именно этот подход, потому что в зависимости от того, как вы его используете, он может быть неэффективным (поскольку PreparedStatement нужно будет «компилировать» каждый раз, когда он получает используется)

14
ответ дан 24 November 2019 в 08:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: