SQL查询in大于1000处理

2023-11-07

近期在代码开发中,发现某些业务场景因为多个服务的调用查询,避免不了使用in,当in的数量小于1000的时候,可以正常使用,但是当in的数量大于1000的时候就会出现报错,针对此类问题主要有两个场景:1.使用Mybatis在XML中写SQL;2.使用MybatisPlus

1. 使用Mybatis在xml中写SQL
思路:将大于1000的条件切割成多段。

代码部分:

/**
 * 切割List的工具类
 */
public class ListSplitUtils {
	/**
	 * list 分割
	 * @param list 待切割list
	 * @param length 切割长度
	 */
	public static <T> List<List<T>> spiltList (List<T> list, int length){
		int size = list.size();
		// 切割数量
		int count = (size + length - 1) / length;
		List<List<T>> resultList = new ArrayList<>(count);
		for(int i = 0; i < count; i++){
			// 开始位置
			int fromIndex = i * length;
			// 结束位置
			int toIndex = Math.min((i + 1) * length, size);
			resultList.add(list.subList(fromIndex, toIndex));
		}
		return resultList;
	}
}

xml 部分:

<if test="params.idList != null and params.idList.size() > 0">
	AND (t.id IN
	<foreach collection="params.idList" index="index" open="(" close=")" item="item" >
		<if test="index !=0">
			<choose>
				<when test="index % 1000 == 999">) OR t.id IN (</when>
				<otherwise>,</otherwise>
			</choose>
		</if>
		#{item}
	</foreach>
	)
</if>

2. 使用MybatisPlus
思路:同样是将大于1000的条件切割成多段。

工具类

/**
 * 切割List的工具类
 */
public class MyBatisParameterUtils {
	/**
	 * in 参数分割
	 * @param wrapper
	 * @param column 检索字段
	 * @param coll 检索条件
	 * @param
	 * @param <T> 实例对象泛型
	 * @parma <F> 条件集合泛型
	 */
	public static <T,F> void cutInParameter (LambdaQueryWrapper<T> wrapper, SFunction<T,?> column,List<F> coll,String type){
		if (CollectionUtils.isEmpty(coll)){
			throw new Exception("参数为空");
		}
		if (coll.size <= 1000){
			wrapper.in(column,coll);
			return;
		}
		List<List<F>> lists = ListSplitUtils.spiltList(coll, 1000);
		wrapper.and(item -> {
			item.in(column, lists.remove(0));
			for(List<F> objList : lists){
				item.or().in(column, objList); 
			}
			return item;
		});
	}
}

使用实例:

 // Object泛指查询的实例对象
 LambdaQueryWrapper<Object> wrapper = new LambdaQueryWrapper<>();
 MybatisParameterUtils.cutInParameter(wrapper, Object::getId,idList);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL查询in大于1000处理 的相关文章

随机推荐

  • Golang Channel通道使用简介

    Golang Channel通道使用简介 一 channel简介 chan 是 Golang 中内置的数据类型 不像 Mutex 等需要引入 它是 first class 类型 在 Go 的并发控制中起着相当重要的作用 chan 的思想来自
  • CWnd指针和HWnd

    HWND是Windows系统中对所有窗口的一种标识 即窗口句柄 这是一个SDK概念 CWnd是MFC类库中所有窗口类的基类 微软在MFC中将所有窗口的通用操作都封装到了这个类中 如 ShowWindow等等 同时它也封装了窗口句柄即m hW
  • linux下编译dbus源码,ubuntu安装dbus

    下载地址 编译安装 configure prefix home ubuntu dbus 1 13 18 install make make install 出现如下错误 configure error The pkg config scri
  • qt Graphic View 学习

    是一种基于图形项的 Graphic Item 模型 视图模式 由场景 视图 图形项组成 1 场景 QGraphicScence类 场景不可见 是管理图像项的容器 场景坐标 等价于Qpainter的逻辑坐标 窗口坐标 setwindow 一般
  • 查询及删除重复记录

    查询及删除重复记录的方法大全 1 查找表中多余的重复记录 重复记录是根据单个字段 peopleId 来判断select from peoplewhere peopleId in select peopleId from people gro
  • Notepad++ 代码格式化

    在阅读别人的代码时偶尔会遇到格式很乱 阅读起来很费劲的情况 若手动改 很容易出错且很费时间 这时可以借助一些专业的编辑器来格式化代码 NotePad 是一个轻量级的代码编辑器 占用内存少 运行速度快 但是Notepad 本身是不带这个格式化
  • Unity基础(06)—— 动画(Animation)的录制与播放

    一 录制动画 将物体移动 操作的过程录制下来保存到一个物理文件 在下次使用的时候直接用代码来调用它即可 如让物体TheCh1 绕Y轴转动90度的动画录制 1 在Unity中打开动画视图 2 选择指定物体 为其添加 Animation 组件
  • python3GUI--PyQt5打包心得(详细图文演示)

    文章目录 一 前言 二 准备工作 介绍 1 准备 2 介绍 1 pyinstaller 2 pipenv 三 项目打包 1 准备 2 打包 1 打包参数 2 虚拟环境 三 总结 一 前言 有朋友私信问我 如何把项目打包和如何减小打包后的文件
  • Handsontable 的数据保存(增删改查+导出excel)

    项目用到handsontable 插件 根据官网 API写的handsontable初始化 数据展示 ajax请求 参数封装 Controller参数接受 全局容器 var AllData var updatelist var delids
  • 基于PyQt5实现简易饮品自动售货机

    记录一个最近Python课程的作业 编写一个简易的饮品自动售货机 购物者选择需要的饮品 通过使用购物卡的方式支付 支付成功后从出货口取出饮品 使用环境 Python3 8 6 PyQt5 5 15 4 搭建的界面GUI 使用的核心代码解析
  • C++ 动态数组

    C 语言和标准库提供了两种一次分配一个对象数组的方法 C 语言定义了另一种new表达式语法 可以分配并初始化一个对象数组 标准库中包含一个名为allocator的类 允许我们将分配和初始化分离 使用allocator通常会提供更好的性能和更
  • Windows 配置双网卡

    1 内网的IP地址要提前知晓备份 外网的IP地址是自动获取的 2 查看当前路由 输入命令 route print 则会看到如下的地址 第一条是默认的外网地址 表示无论访问什么地址都是需要从该IP访问 3 删除原来路由 配置的时候 需要先删除
  • 临床预测模型之生存资料的ROC曲线绘制

    本文首发于公众号 医学和生信笔记 医学和生信笔记 专注R语言在临床医学中的使用 R语言数据分析和可视化 主要分享R语言做医学统计学 meta分析 网络药理学 临床预测模型 机器学习 生物信息学等 生存资料的ROC曲线考虑了时间因素 在画RO
  • 【毕设选题】基于STM32的毕业设计题目项目汇总 - 350例

    文章目录 1前言 2 STM32 毕设课题 3 如何选题 3 1 不要给自己挖坑 3 2 难度把控 3 3 如何命名题目 4 最后 1前言 更新单片机嵌入式选题后 不少学弟学妹催学长更新STM32和C51选题系列 感谢大家的认可 来啦 以下
  • Java正则表达式替换占位符

    项目中使用一个功能 替换字符串中的占位符 当占位符的名称相近时 如 id 和 id1 不能完全区分替换 测试代码如下 测试1 String JAVARGGEX a zA Z0 9 String text id 1 and idx 3 Pat
  • R语言基础编程

    实验二 数据对象与数据读写 实验目的 1 了解R语言中的数据结构 2 了解R语言中数据类型的判别及转换函数 及其应用方法 3 了解R语言中对数据结构操作的函数 及其应用方法 4 了解R语言中读写数据文件的方法 实验内容与实现 1 创建一个对
  • CentOS安装Eigen

    1 下载 切换到root用户 su root 切换root用户 要输入密码 cd 切换到root的家目录 wget http bitbucket org eigen eigen get 3 3 7 tar gz 下载Eigen 2 解压安装
  • cmd命令行访问远程mysql数据库

    示例 mysql uhello pworld h 192 168 1 88 P 3306 D mysql oa mysql u用户名 p密码 h 远程数据库IP地址 P 端口 D 数据库名 连接成功后就可以想操作本地数据库一样了 感觉是不是
  • 现在完成时

    定义一 过去做的动作或状态 导致现在 如果时态是 现在完成时 have has v过去分词 当主语是第三人称单数时使用 has 我已经看过这部电影了 let s watch another movie i have already seen
  • SQL查询in大于1000处理

    近期在代码开发中 发现某些业务场景因为多个服务的调用查询 避免不了使用in 当in的数量小于1000的时候 可以正常使用 但是当in的数量大于1000的时候就会出现报错 针对此类问题主要有两个场景 1 使用Mybatis在XML中写SQL