Я вижу ошибку в SQL и, возможно, неправильный выбор API после этого.Сначала в запросе:
select * from lookup where id && ARRAY[ :ids ]
Чтобы связать параметр массива, его не следует помещать в конструктор ARRAY
, а вместо этого необходимо использовать привязку JDBC, например:
select * from lookup where id && ?
Как вы заметили, я не использую именованный параметр в этих примерах, потому что NamedParameterJdbcTemplate
не предоставляет маршрут для получения объекта java.sql.Connection
или его прокси.Вы можете получить к нему доступ через PreparedStatementSetter
, если вместо этого используете интерфейс JdbcOperations
.
public static List<Map<String,Object>> fetch(NamedParameterJdbcTemplate jdbcTemplate, List<Integer> idlist){
List<Map<String,Object>> result= new ArrayList<>();
String sql = "select * from lookup where id && ?";
final Integer[] ids = idlist.toArray(new Integer[0]);
PreparedStatementSetter parameters = new PreparedStatementSetter() {
@Override
void setValues(PreparedStatement stmt) {
Connection conn = stmt.getConnection();
// this can only be done through the Connection
java.sql.Array arr = conn.createArrayOf("integer", ids);
// you can use setObject(1, ids, java.sql.Types.ARRAY) instead of setArray
// in case the connection wrapper doesn't pass it on to the JDBC driver
stmt.setArray(1, ids);
}
};
JdbcOperations jdo = jdbcTemplate.getJdbcOperations();
result= jdo.query(sql,
parameters,
new RowMapper<Map<String,Object>>() { ...
}
)
}
В коде могут быть ошибки, поскольку я обычно использую другой набор API, и вам нуженБлок try-catch для java.sql.SQLException
в этой функции setValues
, но с этого момента вы сможете справиться с этим.