Вызов запроса с несколькими предложениями IN из JAVA

Этот запрос отлично справляется с SQL Developer: select * from MYTABLE where (field1, field2) IN (('A', '1'), ('B','2'), ('C','3')) ;

Но когда я пытаюсь вызвать его из java, я получаю исключение.

public List<MYVO> callDB(List<String> sourceAndIdList) {
        System.out.println(sourceAndIdList);
        String query = "select * from MYTABLE where (field1, field2) IN (:source_monitorId_list)";
        Map<String, List<String>> namedParameters = Collections.singletonMap("source_monitorId_list", sourceAndIdList);
        return this.namedParameterJdbcTemplate.query(query , namedParameters, new RowMapper<MYVO>() {
            @Override
            public MYVO mapRow(ResultSet rs, int rowNum) throws SQLException {
                ....
            }
        });
    }

Одна распечатка моего списка я получаю: [('A', '1'), ('B', '2'), ('C', '3')]

Исключение:

СЕРЬЕЗНО: Servlet.service () для сервлета [самообслуживание] в контексте с путем [/ mymonitoring] выдал исключение [Ошибка обработки запроса; вложенное исключение - org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; неправильная грамматика SQL [выберите * из MYTABLE, где (field1, field2) IN (?,?,?)]; вложенным исключением является java.sql.SQLSyntaxErrorException: ORA-00920: недопустимый оператор отношения] с основной причиной java.sql.SQLSyntaxErrorException: ORA-00920: недопустимый оператор отношения


РЕДАКТИРОВАТЬ: это не дубликат, поскольку я ищу решение с пружинами NamedParameterJdbcTemplate для запроса с несколькими предложениями IN, а размер параметров известен только во время выполнения.


person Zeeshan    schedule 12.02.2016    source источник
comment
В этом вопросе есть новый аспект, на который нет ответа в другом. Речь идет о вложенных картах параметров. Важным аспектом параметров PreparedStatement является то, что список плоский. Принимаются только объекты, напрямую отображаемые на типы SQL.   -  person nolexa    schedule 12.02.2016


Ответы (1)


Вы не можете использовать такой параметр привязки в «IN».

Либо вы делаете:

IN ((:p1, :p2), (:p3,:p4), (:p5,:p6))

Но предполагается, что вы точно знаете, сколько элементов у вас есть (в данном случае 3), или вы «материализуете» свои параметры в строке SQL:

String query = "select * from MYTABLE where (field1, field2) IN (('A', '1'), ('B', '2'), ('C', '3'))";
person Marco Polo    schedule 12.02.2016
comment
У вас опечатка в выражении IN (:p1, :p2, p3). Отсутствует последний двоеточие. - person Neil; 12.02.2016