Java中使用List传入Oracle的IN查询

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)。 ‌‌

相关推荐
ba_pi19 分钟前
springAI2.0接入mcp读取mysql
java·agent·spring ai
隔窗听雨眠22 分钟前
Oracle普通表自动改造分区表:从评估到自动化维护的完整实战指南
oracle
宸津-代码粉碎机25 分钟前
Java面试核心:JVM三大GC垃圾回收算法原理与生产场景落地分析
java·大数据·人工智能·python·spring
Ivanqhz27 分钟前
BPE(Byte Pair Encoding) 算法
java·服务器·网络·深度学习·神经网络
愛芳芳31 分钟前
Swagger2 多环境动态配置实战指南
java·后端·maven·springboot·swagger
huaweichenai34 分钟前
spring boot实现任务异步处理(队列)
java·spring boot
MZA66638 分钟前
实战:基于 XXL-JOB + 策略模式 + Nacos 配置化的 CSV 导出任务系统设计
java·spring boot·mybatis
邪修king43 分钟前
Re:Linux 系统篇(二十九):动静态库Chapter2:动态库深度辨析 —— 核心本质、制作流程、双阶段查找模型与排错指南
android·java·linux·开发语言
泡海椒1 小时前
告别 iText 繁杂配置:jquick-pdf 极简 PDF 生成实战(零基础上手)
java·开发语言·pdf
步行cgn2 小时前
Spring 注入 List 集合详解
windows·spring·list