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

Этот запрос отлично работает от разработчика SQL: 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')]

Исключение:

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


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

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'))";
Другие вопросы по тегам