Java中使用List传入Oracle的IN查询时,若元素数量超过1000会报错,需通过分组处理避免此限制。
1、问题原因
Oracle数据库对IN子句的元素数量有限制(最多1000个),超过时会抛出ORA-01795错误。
2、解决方案
(1)数组分组处理
按固定分组数或每组元素数分割List,生成多个IN子句。
示例代码:
public static List<List<T>> averageAssign(List<T> source, int n) {
// 按分组数分割
}
public static List<List<T>> averageAssignByPer(List<T> source, int n) {
// 按每组元素数分割
}
(2)拼接多个IN条件
使用OR连接多个IN子句,避免单个子句超限。
示例代码:
public String splitInCondition(List<String> dataList, String columnName) {
StringBuilder sqlBuilder = new StringBuilder();
int count = 0;
while (count < dataList.size()) {
if ((count + 1) % 1000 == 0) {
sqlBuilder.append(") OR ").append(columnName).append(" IN (");
}
sqlBuilder.append("'").append(dataList.get(count)).append("',");
count++;
}
sqlBuilder.deleteCharAt(sqlBuilder.length() - 1).append(")");
return sqlBuilder.toString();
}
(3) 存储过程传参
将List转换为Oracle数组,通过存储过程批量插入。
示例代码:
public static ARRAY getArray(Connection conn, String objType, String listType, List<?> listData) {
// 构建Oracle数组并返回
}
3、注意事项
避免直接使用大List的IN查询,优先分组或改用其他批量操作(如批量插入语句)。
存储过程传参需确保Java对象与Oracle类型匹配(如NVARCHAR2对应String)。