Построение запроса выбора с помощью предложения IN (...) - PullRequest
2 голосов
/ 09 июня 2011

Мне нужно выбрать * на основе списка идентификаторов ввода, каков наилучший способ пакетного выбора? вот что у меня есть

StringBuilder inClause = new StringBuilder();
boolean firstValue = true;
for (int i=0; i < batchSize; i++) {
  inClause.append(&#39;?&#39;);
  if ( firstValue ) {
    firstValue = false;
  } else {
    inClause.append(&#39;,&#39;);
  }
}
PreparedStatement stmt = conn.prepareStatement(
    "select id, name from users where id in (" + inClause.toString() + ')');


for (int i=0; i < batchSize; i++) {
  stmt.setInt(i);  // or whatever values you are trying to query by
}

1 Ответ

2 голосов
/ 09 июня 2011

Это выглядит довольно хорошо для меня.Только что обнаружил логическую ошибку в этом блоке кода:

boolean firstValue = true;
for (int i=0; i < batchSize; i++) {
  inClause.append('?');
  if ( firstValue ) {
    firstValue = false;
  } else {
    inClause.append(',');
  }
}

Он не добавит , после первого элемента.И было бы , после последнего.Таким образом, вам не нужно беспокоиться об этом , здесь.Просто сделайте это так

for (int i=0; i < batchSize; i++) {
  inClause.append('?, ');
}

Затем нарежьте последние два символа, как это,

PreparedStatement stmt = conn.prepareStatement(
    "select id, name from users where id in (" + 
    inClause.substring(0, inClause.length()-2) + ')');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...