Этот запрос отлично справляется с 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, а размер параметров известен только во время выполнения.
PreparedStatement
является то, что список плоский. Принимаются только объекты, напрямую отображаемые на типы SQL. - person nolexa   schedule 12.02.2016