Я пытаюсь выполнить приведенный ниже запрос с предложением IN и передачей кортежей с номером 32767 или более с помощью метода NamedParameterJdbcTemplate.query.Но я получаю ошибку ниже:
In DataAccessException:PreparedStatementCallback; bad SQL grammar [SELECT ID, STATUS FROM ID_DETAILS WHERE (ID, 1) IN ((?, ?), (?, ?), (?, ?), (?, ?)..32767 times) ORDER BY ID, EL_SEQ ASC]; nested exception is java.sql.SQLSyntaxErrorException: ORA-00920: invalid relational operator
Эта ошибка НЕ выдается, когда число переданных идентификаторов меньше или равно 32766 .Может ли кто-нибудь помочь в этом отношении
Ниже приведен код, используемый:
List<Object[]> ids = getToupleOf(idList); //idList has 32767 or more Long values
MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("IDLIST", ids);
NamedParameterJdbcTemplate namedParameterJdbcTemplate = new
NamedParameterJdbcTemplate(
getJdbcTemplate().getDataSource());
return namedParameterJdbcTemplate.query(SQLConstants.REFRESH_QUERY,
parameters,
new ResultSetExtractor<List<ResponseVO>>() {
@Override
public List<ResponseVO> extractData(ResultSet rs)
throws SQLException, DataAccessException {
List<ResponseVO> retList = new LinkedList<ResponseVO>();
while (rs.next()) {
ResponseVO eachResponse = constructResponseVOFromRS(rs);
retList.add(eachResponse);
}
return retList;
}
});
Ниже приведен код для getToupleOf ():
private List<Object[]> getToupleOf(List<Long> idSet){
List<Object[]> list = new LinkedList<Object[]>();
idSet.forEach(l->{
Object[] touple = new Object[2];
touple[0] = l.longValue();
touple[1] = 1;
list.add(touple);
});
return list;
}
SQLConstants.REFRESH_QUERY мыпрохождение дано ниже:
public static final String REFRESH_QUERY = "SELECT ID, STATUS FROM ID_DETAILS WHERE (ID, 1) IN (:IDLIST) ORDER BY ID, EL_SEQ ASC";