Java 将NamedParameterJdbcTemplate.query与元组一起使用时,32766条记录后的关系运算符无效
我正在尝试使用IN子句执行以下查询,并使用NamedParameterJdbcTemplate.query方法传递编号为32767或更多的元组。但是,我得到了以下错误:Java 将NamedParameterJdbcTemplate.query与元组一起使用时,32766条记录后的关系运算符无效,java,spring,oracle,syntax-error,jdbctemplate,Java,Spring,Oracle,Syntax Error,Jdbctemplate,我正在尝试使用IN子句执行以下查询,并使用NamedParameterJdbcTemplate.query方法传递编号为32767或更多的元组。但是,我得到了以下错误: In DataAccessException:PreparedStatementCallback; bad SQL grammar [SELECT ID, STATUS FROM ID_DETAILS WHERE (ID, 1) IN ((?, ?), (?, ?), (?, ?), (?, ?)..32767 times)
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
当传递的ID数小于或等于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;
}
});
您知道队列中的参数数量是有限制的吗?我可以知道哪个队列有限制吗?这取决于您使用的数据库及其配置。通常限制在1000左右。我们正在使用Oracle,我在第条中知道1000的限制。因此,我们使用元组。限制是在总数上,无论您如何使用它们,我注意到您有
(ID,1)
,以前从未见过这一点。您确定此处允许1
?
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;
}
public static final String REFRESH_QUERY = "SELECT ID, STATUS FROM ID_DETAILS WHERE (ID, 1) IN (:IDLIST) ORDER BY ID, EL_SEQ ASC";