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

相关推荐
TDengine (老段)14 分钟前
TDengine 免费版说明
java·大数据·数据库·物联网·时序数据库·tdengine
码上有光18 分钟前
异常和智能指针
java·大数据·c++·servlet·异常·智能指针
学计算机的计算基1 小时前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法
tachibana21 小时前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode
2301_768103491 小时前
HarmonyOS趣味相机实战第31篇:图片文档List、详情弹层与删除状态闭环
list·harmonyos·arkts·状态管理·arkui
万亿少女的梦1681 小时前
基于Spring Boot、Java与MySQL的网络订餐系统设计与实现
java·spring boot·mysql·系统设计·网络订餐
咩咩啃树皮10 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚10 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白12 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司12 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求