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处理 的相关文章

  • 如何强制jar使用(或jar运行的jvm)utf-8而不是系统的默认编码

    我的Windows默认编码是GBK 而我的Eclipse完全是utf 8编码 因此 在我的 Eclipse 中运行良好的应用程序崩溃了 因为导出为 jar 文件时这些单词变得不可读 我必须在 bat 文件中写入以下行才能运行该应用程序 st
  • HAProxy SSL终止+客户端证书验证+curl/java客户端

    我希望使用我自己的自签名证书在 HAProxy 上进行 SSL 终止 并使用我创建的客户端证书验证客户端访问 我通过以下方式创建服务器 也是 CA 证书 openssl genrsa out ca key 1024 openssl req
  • 将SQL数据引入jquery availabletag

    我正在尝试制作自动完成文本框 但如何将 SQL 数据包含到 jquery 可用标记并循环它 我无法根据以下代码执行该功能 任何帮助 将不胜感激 谢谢 这是我的预期输出 预期结果演示 http jsfiddle net VvETA 71 jq
  • INTEGER 到 DATETIME 的转换与 VB6 不同

    我正在查看一些遗留的 VB6 代码 比我的时代早很多年 它对 SQL 2005 数据库运行查询 它提供了日期限制WHERE子句 其中日期作为整数值给出CLng VB6 中的日期 e g WHERE SomeDateField gt 4006
  • tomcat 7.0.50 java websocket 实现给出 404 错误

    我正在尝试使用 Java Websocket API 1 0 JSR 356 中指定的带注释端点在 tomcat 7 0 50 上实现 websocket 以下是我如何对其进行编码的简要步骤 1 使用 ServerEndpoint注解编写w
  • 如何在java Spring Boot中实现通用服务类?

    我有许多具有重复代码的服务 我想知道如何实现通用服务 以便我的所有服务都可以扩展它 服务接口示例 重复代码 Service public interface IUserService List
  • 是否可以从 servlet 内部以编程方式设置请求上下文路径?

    这是一个特殊情况 我陷入了处理 企业 网络应用程序的困境 企业应用程序正在调用request getContext 并将其与另一个字符串进行比较 我发现我可以使用 getServletContext getContextPath 获取 se
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则
  • 如何通过注解用try-catch包装方法?

    如果应该在方法调用中忽略异常 则可以编写以下内容 public void addEntryIfPresent String key Dto dto try Map
  • 添加到列表时有没有办法避免循环?

    我想知道这样的代码 List
  • 在 Java 中通过 XSLT 分解 XML

    我需要转换具有嵌套 分层 表单结构的大型 XML 文件
  • 如何删除日期对象的亚秒部分

    当 SQL 数据类型为时间戳时 java util Date 存储为 2010 09 03 15 33 22 246 如何在存储记录之前将亚秒设置为零 例如 在本例中为 246 最简单的方法是这样的 long time date getTi
  • 如何通过 Android 按钮单击运行单独的应用程序

    我尝试在 Android 应用程序中添加两个按钮 以从单独的两个应用程序订单系统和库存系统中选择一个应用程序 如图所示 我已将这两个应用程序实现为两个单独的 Android 项目 当我尝试运行此应用程序时 它会出现直到正确选择窗口 但是当按
  • 在 Clojure 中解压缩 zlib 流

    我有一个二进制文件 其内容由zlib compress在Python上 有没有一种简单的方法可以在Clojure中打开和解压缩它 import zlib import json with open data json zlib wb as
  • Java - 从 XML 文件读取注释

    我必须从 XML 文件中提取注释 我找不到使用 JDOM 或其他东西来让它们使用的方法 目前我使用 Regex 和 FileReader 但我不认为这是正确的方法 您可以使用 JDOM 之类的东西从 XML 文件中获取注释吗 或者它仅限于元
  • 索引在 NOT IN 或 <> 子句中起作用吗?

    我读过 至少 Oracle 数据库中的普通索引基本上是 B 树结构 因此存储处理适当根节点的记录 小于 根的记录被迭代地存储在树的左侧部分 而 大于 根的记录被存储在右侧部分 正是这种存储方法有助于通过树遍历实现更快的扫描 因为深度和广度都
  • 如何从 Ant 启动聚合 jetty-server JAR?

    背景 免责声明 I have veryJava 经验很少 我们之前在 Ant 构建期间使用了 Jetty 6 的包装版本来处理按需静态内容 JS CSS 图像 HTML 因此我们可以使用 PhantomJS 针对 HTTP 托管环境运行单元
  • 替换文件中的字符串

    我正在寻找一种方法来替换文件中的字符串而不将整个文件读入内存 通常我会使用 Reader 和 Writer 即如下所示 public static void replace String oldstring String newstring
  • 何时在 hibernate 中使用 DiscriminatorValue 注解

    在 hibernate 中使用 DiscriminatorValue 注释的最佳场景是什么以及何时 这两个链接最能帮助我理解继承概念 http docs oracle com javaee 6 tutorial doc bnbqn html
  • 记录类名、方法名和行号的性能影响

    我正在我的 java 应用程序中实现日志记录 以便我可以调试应用程序投入生产后可能出现的潜在问题 考虑到在这种情况下 人们不会奢侈地使用 IDE 开发工具 以调试模式运行事物或单步执行完整代码 因此在每条消息中记录类名 方法名和行号将非常有

随机推荐

  • 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