Вызов запроса с несколькими предложениями 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'))";