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

相关推荐
virus594519 小时前
悟空CRM mybatis-3.5.3-mapper.dtd错误解决方案
java·开发语言·mybatis
没差c20 小时前
springboot集成flyway
java·spring boot·后端
时艰.20 小时前
Java 并发编程之 CAS 与 Atomic 原子操作类
java·开发语言
编程彩机21 小时前
互联网大厂Java面试:从Java SE到大数据场景的技术深度解析
java·大数据·spring boot·面试·spark·java se·互联网大厂
笨蛋不要掉眼泪21 小时前
Spring Boot集成LangChain4j:与大模型对话的极速入门
java·人工智能·后端·spring·langchain
Yvonne爱编码21 小时前
JAVA数据结构 DAY3-List接口
java·开发语言·windows·python
像少年啦飞驰点、1 天前
零基础入门 Spring Boot:从“Hello World”到可上线微服务的完整学习指南
java·spring boot·微服务·编程入门·后端开发
眼眸流转1 天前
Java代码变更影响分析(一)
java·开发语言
Yvonne爱编码1 天前
JAVA数据结构 DAY4-ArrayList
java·开发语言·数据结构
阿猿收手吧!1 天前
【C++】C++原子操作:compare_exchange_weak详解
java·jvm·c++