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

相关推荐
考虑考虑19 分钟前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯1 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
青石路5 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
像我这样帅的人丶你还8 小时前
Java 后端详解(五):Redis 缓存
java·后端·全栈
plainGeekDev10 小时前
GreenDAO → Room
android·java·kotlin
亦暖筑序15 小时前
Java 8老系统AI Workflow实战:把一次性AI对话升级成可恢复工作流
java·后端
敲代码的彭于晏16 小时前
Bean 生命周期完全图解:前端同学也能看懂的 Spring 核心机制
java·前端·后端
plainGeekDev17 小时前
ButterKnife → ViewBinding
android·java·kotlin
像我这样帅的人丶你还1 天前
Java 后端详解(四):分页与搜索
java·javascript·后端
她的男孩1 天前
数据权限为什么不能只靠注解?Forge 的 Mapper 层 SQL 改写源码拆解
java·后端·架构