在开发中遇到报错:
Oracle 中in超过1000个值遇到ORA-01795: maximum number of expressions in a list is 1000
原因是例如如下sql:
SELECT * FROM USER WHERE ID IN (‘A’,‘B’,‘C’…)
在in条件后,只允许拼接最多1000个筛选元素。当超过1000条将会报错。所以解决方式是:分批处理
代码如下:
public void updateFxList(List<String> ids) {
int batchSize = 800; // 每批处理 800 条数据
int total = ids.size();
int start = 0;
int end = Math.min(start + batchSize, total);
while (start < total) {
List<String> batch = ids.subList(start, end);
// 更新当前批次的数据
kspjRepository.updateKspjStatusToFx(batch);
// 更新下一批次的起始位置
start = end;
end = Math.min(start + batchSize, total);
}
}
int batchSize = 800; 定义了每次处理的数据量为 800 条。
int total = ids.size(); 获取传入的 ids 列表的总长度。
int start = 0;: 初始化开始索引为 0。
int end = Math.min(start + batchSize, total);: 计算结束索引,确保不会超出 ids 列表的实际长度。
while (start < total) {…}: 循环处理直到所有数据都被处理完毕。
List batch = ids.subList(start, end);: 根据当前的开始和结束索引从 ids 中截取一个子列表作为当前批次的数据。
kspjRepository.updateKspjStatusToFx(batch);: 调用仓库方法 updateKspjStatusToFx 来更新当前批次的数据状态。
start = end;: 更新开始索引为上一批次的结束索引。
end = Math.min(start + batchSize, total);: 计算下一个批次的结束索引,确保不会超出列表范围。