解决MyBatis在 Oracle 中使用 IN 语句不能超过 1000 问题
在 Oracle 数据库中,IN 语句常用于查询某个字段是否属于一组特定的值。对于大多数开发者而言,IN 是一种简单直观的查询方式,能够提升开发效率,避免过多的 OR 语句。然而,许多人在使用 IN 语句时可能遇到一个问题,即查询中的 IN 子句无法处理超过 1000 个元素。这一限制是 Oracle 数据库的内在设计问题,虽然不常见,但一旦遇到,可能会造成应用程序崩溃或性能问题。
为什么会有 IN 语句限制?
Oracle 数据库对 IN 语句的限制是由 Oracle 的 SQL 解析器在设计时决定的。具体来说,Oracle 限制了在单个 SQL 查询中 IN 子句能够接受的最大参数数量为 1000 个。这意味着,如果我们在 IN 子句中列出超过 1000 个值,Oracle 会抛出类似以下错误:
ORA-01795: maximum number of expressions in a list is 1000
这种限制的原因主要是为了避免解析器需要处理过多的参数,这样做有助于保证系统的性能和资源管理。然而,在实际开发中,尤其是数据量非常大的情况下,这种限制可能会影响业务逻辑的实现。
解决 Oracle IN 语句超过 1000 问题的方案
1. 分批次使用 IN 语句
最简单的解决方案就是将超过 1000 个的元素分批处理。具体做法是将数据分成多个子集,每个子集包含 1000 个或更少的元素,然后为每个子集执行一个 IN 查询。
/*** 拆分多条SQL执行大数据量IN查询** @throws IOException*/@Testpublic void test_listOrder_batch() throws IOException {SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));SqlSession sqlSession = sqlSessionFactory.openSession();OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);UserOrderRequest request = new UserOrderRequest();List<String> orderIdList = new ArrayList<>();for (int i = 0; i < 15000; i++) {orderIdList.add(String.valueOf(i));}// 查询结果List<Order> ordersResult = new ArrayList<>();// 分批次查询List<List<String>> splitOrderIdList = Lists.partition(orderIdList, 1000);for (List<String> splitList : splitOrderIdList) {request.setOrderIdList(splitList);ordersResult.addAll(mapper.selectOrders(request));}}
2.使用 foreach 动态生成 IN 子句,一条SQL处理
上面的方式会需要拆分为多次SQL执行,如果想要在一个SQL中完成可以通过双重foreach。使用 foreach 动态生成 IN 子句是一种常见的处理批量查询的方法,但当数据量很大时,需要注意 SQL 长度和数据库限制。
<select id="selectOrders" resultType="com.zy.client.bean.Order">SELECT * FROM orders WHERE 1=1<if test="splitOrderIdList !=null and splitOrderIdList.size()>0">and (<foreach collection="splitOrderIdList" item="orderIdList" open="(" close=")" separator="OR">order_id in<foreach collection="orderIdList" item="orderId" open="(" close=")" separator=",">#{orderId}</foreach></foreach>)</if></select>
@Testpublic void test_listOrder_foreach2() throws IOException {SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));SqlSession sqlSession = sqlSessionFactory.openSession();OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);UserOrderRequest request = new UserOrderRequest();List<String> orderIdList = new ArrayList<>();for (int i = 0; i < 3; i++) {orderIdList.add(String.valueOf(i));}List<List<String>> splitOrderIdList = Lists.partition(orderIdList, 2);request.setSplitOrderIdList(splitOrderIdList);List<Order> orders = mapper.selectOrders(request);log.info("输出结果:{}", orders);}
执行SQL示例
SELECT *
FROM orders
WHERE 1 = 1and ((order_id in ('0', '1')OR order_id in ('2')));
相关文章:
解决MyBatis在 Oracle 中使用 IN 语句不能超过 1000 问题
在 Oracle 数据库中,IN 语句常用于查询某个字段是否属于一组特定的值。对于大多数开发者而言,IN 是一种简单直观的查询方式,能够提升开发效率,避免过多的 OR 语句。然而,许多人在使用 IN 语句时可能遇到一个问题&#…...
最长递增子序列两种算法实现(动态规划,二分查找)
恭喜你刷到博主 DP 经典题目详解部分第一期,想学好 DP 请关注订阅,会持续更新!!!!! 建议先阅读DP算法入门 00001 最长递增子序列(Longest Increasing Subsequence,简写…...
Deepmotion技术浅析(三):特征提取
DeepMotion 的特征提取模块是整个动作捕捉和 3D 追踪流程的基础,负责从输入的视频帧中提取出具有代表性的视觉特征。这些特征将被用于人体姿态估计、动作识别、3D 重建等后续任务。 包括: 1.图像特征提取 卷积神经网络(CNN) 卷…...
国内CentOS使用yum安装docker和docker-compose
安装docker 安装需要的软件包, yum-util 提供yum-config-manager功能,另两个是devicemapper驱动依赖 yum install -y yum-utils device-mapper-persistent-data lvm2下载yum源采用阿里云的镜像源 wget -O /etc/yum.repos.d/docker-ce.repo https://mi…...
python学opencv|读取图像(十三)BGR图像和HSV图像互相转换深入
【1】引言 前序学习过程中,我们偶然发现:如果原始图像是png格式,将其从BGR转向HSV,再从HSV转回BGR后,图像的效果要好于JPG格式。 文章链接为: python学opencv|读取图像(十二)BGR图…...
【鸿蒙实战开发】数据的下拉刷新与上拉加载
本章介绍 本章主要介绍 ArkUI 开发中最常用的场景下拉刷新, 上拉加载,在本章中介绍的内容在实际开发过程当中会高频的使用,所以同学们要牢记本章的内容。下面就让我们开始今天的讲解吧! List 组件 在 ArkUI 中List容器组件也可以实现数据滚动的效果&a…...
面向对象设计规则和各类设计模式
面向对象设计(Object-Oriented Design, OOD)是一种软件设计方法论,它使用对象、类、继承、封装、多态等概念来组织代码。面向对象设计的核心目标是提高软件的可维护性、可扩展性和复用性。在面向对象设计中,遵循一定的设计原则和模…...
《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(六)
《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(六) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《拉…...
利用Docker分层构建优化镜像大小
合适docker镜像文件大小不仅影响容器启动效率,也影响资源占用效率。本文介绍如何利用分层方式构建docker镜像,采用多种方式避免镜像文件太大而影响性能。 Docker 镜像大小优化的重要性 资源利用效率 较小的镜像文件在存储和传输过程中占用更少的空间和带…...
Spring 魔法探秘:从 Bean 线程安全到事务魔法全解析
1.Spring 框架中的单例 Bean 是线程安全的么? Spring 框架中的单例 Bean 本身并不保证线程安全性。单例模式意味着在整个应用程序的生命周期中,只会创建该 Bean 的一个实例,并且所有对该 Bean 的请求都将共享这个实例。 线程安全与否取决于…...
[Maven]IDEA父工程创建子工程后父工程不可运行
IDEA在使用maven构建项目时,如果你在当前工程下创建一个子工程,那么原有的工程(变为父工程的工程)原有的代码通常会变得不可运行。 这是因为,使用maven创建父子工程关系后,IDEA会自动变更项目的模块相关配置。 比如这是我maven工程…...
【系统移植】在开发板上加载内核和根文件系统的三种方法
实现环境:ubuntu24.04和FS4412实验平台。 要在开发板上运行linux操作系统,首先要将linux内核镜像(uImage)、设备树(dexynos4412-fs4412.dtb)和根文件系统镜像(ramdisk.img)加载到开发板内存。有以下几种方式加载: 一、通过tftp加载内核和根文件系统 二、通过EMMC加…...
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍02-基于错误消息的SQL注入(Error-Based SQL Injection)
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...
数据结构-排序(来自于王道)
排序的基本概念 插入排序 在这个算法中,除了输入的数组本身,没有使用额外的数据结构来存储数据,所有的操作都是在原数组上进行的。因此,无论输入数组的大小 n 是多少,算法执行过程中所占用的额外空间是固定的ÿ…...
【蓝桥杯选拔赛真题93】Scratch青蛙过河 第十五届蓝桥杯scratch图形化编程 少儿编程创意编程选拔赛真题解析
目录 Scratch青蛙过河 一、题目要求 编程实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、python资料 Scr…...
ReactPress最佳实践—搭建导航网站实战
Github项目地址:https://github.com/fecommunity/easy-blog 欢迎Star。 近期,阮一峰在科技爱好者周刊第 325 期中推荐了一款开源工具——ReactPress,ReactPress一个基于 Next.js 的博客和 CMS 系统,可查看 demo站点。(…...
Hive-4.0.1数据库搭建(可选配置用户名密码远程连接)
1.官网下载tar包上传到服务器并解压(我这里解压到了hive目录): 2.进入到conf目录,并复制模板配置文件进行修改: cd /apache-hive-4.0.1-bin/conf cp hive-default.xml.template hive-site.xml3.编写内容如下: <property>&…...
P8772 求和 P8716 回文日期
文章目录 [蓝桥杯 2022 省 A] 求和[蓝桥杯 2020 省 AB2] 回文日期 [蓝桥杯 2022 省 A] 求和 题目描述 给定 n n n 个整数 a 1 , a 2 , ⋯ , a n a_{1}, a_{2}, \cdots, a_{n} a1,a2,⋯,an, 求它们两两相乘再相加的和,即 S a 1 ⋅ a 2 a 1 ⋅ a 3 ⋯ a…...
MySQL迁移SQLite
将 MySQL 的表结构和数据迁移到 SQLite,可以通过以下步骤实现。这个过程主要包括导出 MySQL 数据库到 SQL 文件,然后将其导入到 SQLite 数据库中。 步骤 1: 导出 MySQL 数据库 首先,需要将 MySQL 数据库导出为一个 SQL 文件。可以使用 mysq…...
RocketMQ中的顺序消息和乱序消息详解
内容编辑中… 1.背景 顺序消息是消息队列 RocketMQ 提供的一种高级消息类型。 对于一个指定的Topic,消息严格按照先进先出(FIFO)的原则进行消息发布和消费。 即先发送的消息先消费,后发送的消息后消费。 顺序消息在发送、存储和投递的处理过程中,强调多条消息间的先后…...
PCB设计中数字地与模拟地的区分与处理技巧
1. 数字地与模拟地的本质区别在PCB设计中,地线(GND)是电路参考零电位的公共导体。但为什么工程师们要煞费苦心地把"地"分为数字地和模拟地呢?这得从两种电路的本质特性说起。数字电路的工作特点是突变的开关状态。以常见…...
OmX Hooks完全指南:轻松扩展你的AI助手功能
OmX Hooks完全指南:轻松扩展你的AI助手功能 【免费下载链接】oh-my-codex OmX - Oh My codeX: Your codex is not alone. Add hooks, agent teams, HUDs, and so much more. 项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-codex OmX(O…...
【预测模型】基于VMD-SE-GRU+Transformer多变量时序预测 Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。👇 关注我领取海量matlab电子书和数学建模资料🍊个人信条:格物致知,完整Matl…...
seo网站诊断需要哪些资料_seo网站诊断的重要性是什么
SEO网站诊断需要哪些资料 网站的关键字分析资料 关键字分析是SEO网站诊断中的核心部分之一。你需要收集关于网站当前使用的关键字的数据,包括关键字的搜索量、竞争程度、点击率和转化率等信息。可以使用工具如Google关键字规划师、Ahrefs或SEMrush来获取这些数据。…...
利用快马AI快速生成Python接口自动化测试框架原型
利用快马AI快速生成Python接口自动化测试框架原型 最近在做一个Web项目的测试工作,发现手动测试效率太低,决定搭建一个自动化测试框架。作为一个Python开发者,我选择了pytestrequests的组合,但从头开始搭建框架需要不少时间。这时…...
PyTorch实战:手把手拆解CLIP中的AttentionPool2d模块(附完整代码与逐行注释)
PyTorch实战:手把手拆解CLIP中的AttentionPool2d模块(附完整代码与逐行注释) 当你第一次看到CLIP模型的AttentionPool2d模块时,可能会被它独特的结构所困惑。这个看似简单的模块,实际上是CLIP能够理解图像全局上下文信…...
从“炼金术”到“建筑学”:深度学习结构设计的五大范式
在深度学习的早期,我们往往沉迷于增加层数、调整学习率或更换激活函数,这种“调参黑盒”更像是某种现代炼金术。但随着领域的发展,优秀的架构设计正逐渐转向“建筑学”——即基于问题的内在物理性质或几何约束,去构建具有特定“脾…...
Xamarin.Macios性能优化终极指南:10个让你的应用运行如飞的技巧
Xamarin.Macios性能优化终极指南:10个让你的应用运行如飞的技巧 【免费下载链接】xamarin-macios .NET for iOS, Mac Catalyst, macOS, and tvOS provide open-source bindings of the Apple SDKs for use with .NET managed languages such as C# 项目地址: http…...
如何用本地备份打造数字记忆保险箱?GetQzonehistory全攻略
如何用本地备份打造数字记忆保险箱?GetQzonehistory全攻略 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在这个信息爆炸的时代,我们的数字足迹如同沙滩上的脚印…...
Unity游戏插件加载器MelonLoader完全指南:从安装到精通
Unity游戏插件加载器MelonLoader完全指南:从安装到精通 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader 在Unity游戏…...
