как работает PreparedStatement.setString внутри l oop? - PullRequest
0 голосов
/ 19 июня 2020

У меня есть список параметров запроса в моем URL-адресе, которые я хочу использовать в своей java веб-службе для выполнения запроса к таблице

public Set<Result> getResult(String query, List<String> sortedQueryParamsValue) {
    Connection connection = getConnection();//jdbc connection
    //query is some thing like:  select * from table A where status = ? and Id = ? 
    try (PreparedStatement getStatement = connection.prepareStatement(query)) {            
        for (int i = 0; i <sortedQueryParamKeys.size(); i++) {// sortedQueryParamsValue length is matching the number of values I need for the query and the order matches the order I am expecting
            String value = sortedQueryParamsValue.get(i);
            getStatement.setString(1, value);
        }
    try (ResultSet rs = getStatement.executeQuery()) {
        while (rs.next()) {
            //add to the list of results
        }
    }
    //return the resultset

}

Причина, по которой я всегда использовал 1 в getStatement.setString(1, value); - это то, что я думал, что на каждой итерации один ? заменяется значением, но в конце я получаю какое-то исключение, говорящее java. sql .SQLException: IN or OUT param отсутствует в позиции 2.

Кто-нибудь знает, что я здесь делаю не так?

Ответы [ 2 ]

2 голосов
/ 19 июня 2020

Вы не можете использовать 1 каждый раз в getStatement.setString(). Вы также должны увеличить это число, чтобы заменить второе ? фактическим значением.

Поскольку вы все время передаете только 1, а затем пытаетесь выполнить запрос, Java говорит что для второго ? нет значения, когда вы получаете java.sql.SQLException: IN or OUT param missing at position 2.

Замена getStatement.setString(1, value) на getStatement.setString(i+1, value) должна помочь. Но вам нужно убедиться, что количество элементов в sortedQueryParamsValue равно количеству ? в вашем getStatement запросе.

EDIT: исправлено setString(i,value) на setString(i+1,value) после @ Комментарий Эритрея.

0 голосов
/ 19 июня 2020

Проблема заключалась в том, что при передаче параметра запроса через URL-адрес в остальной API может быть несколько пробелов, и эти пробелы приводят к тому, что запрос возвращается пустым, я собираюсь изменить 1 на i + 1, чтобы не вводить читателей в заблуждение

...