mybatis 动态SQL巧用突破in数量限制的方案
痛点
oracle 11g 只能in1000个条件,大数据量无法处理
功能说明
用于解决数据库 IN 子句参数数量限制问题(如 Oracle 的 1000 元素限制),通过动态分块生成多组 IN 条件。
完整代码示例
<if test="piids != null and piids.size > 0">
AND (t0.processinstid IN
<trim suffixOverrides=" OR t0.processinstid IN()">
<foreach collection="piids" item="item" index="index" open="(" close=")">
<if test="index != 0">
<choose>
<when test="index % 1000 == 999">) OR t0.processinstid IN (</when>
<otherwise>,</otherwise>
</choose>
</if>
#{item}
</foreach>
</trim>
)
</if>
语法逐层解析
- 外层条件判断
<if test="piids != null and piids.size > 0"> - trim 标签清理
<trim suffixOverrides=" OR t0.processinstid IN()">
解决的问题:消除最后一块可能残留的无效语句
机制:自动删除结尾匹配的指定字符串 - foreach 分块逻辑
<foreach collection="piids" item="item" index="index" open="(" close=")">
分块规则
<choose>
<when test="index % 1000 == 999">) OR t0.processinstid IN (</when>
<otherwise>,</otherwise>
</choose>
分块策略:
每 1000 个元素 分块(索引从0开始计算)
index % 1000 == 999 ➔ 第1000个元素时触发分块
连接方式:
同块元素用 , 连接
分块时用 ) OR t0.processinstid IN ( 连接
数据库适配对照表
| 数据库 | IN 列表限制 | 调整方案 |
|---|---|---|
| Oracle | 1000 | 保持现有代码:index % 1000 == 999 (索引从0开始,第1000个元素时分块) |
| SQL Server | 2100 | 修改为:index % 2100 == 2099 (索引达到2099时触发分块) |
| MySQL | 无硬性限制 | 移除分块逻辑,直接逗号连接所有元素 |
| PostgreSQL | 无硬性限制 | 移除分块逻辑,直接逗号连接所有元素 |
补充说明:
Oracle/SQL Server 分块逻辑
- 因数据库对
IN子句的表达式数量有严格限制,需通过模运算 (%) 控制分块节点。 - 公式:
index % N == (N-1),其中N为数据库允许的最大值(Oracle=1000,SQL Server=2100)。
- 因数据库对
MySQL/PostgreSQL 优化
- 可直接简化为:
<foreach collection="piids" item="item" open="(" close=")" separator=","> #{item} </foreach>
- 可直接简化为:
到此这篇关于mybatis 动态SQL巧用突破in数量限制的文章就介绍到这了,更多相关mybatis in数量限制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
在SpringBoot中使用@Value注解来设置默认值的方法
Spring Boot提供了一种使用注解设置默认值的方式,即使用 @Value 注解,下面这篇文章主要给大家介绍了关于如何在SpringBoot中使用@Value注解来设置默认值的相关资料,需要的朋友可以参考下2023-10-10
SpringBoot解决@Component无法注入其他Bean的问题
这篇文章主要介绍了SpringBoot解决@Component无法注入其他Bean的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-08-08
由ArrayList来深入理解Java中的fail-fast机制
fail-fast俗称快速失败,是在多线程进行迭代操作时产生冲突的一种异常抛出机制,下面我们就由ArrayList来深入理解Java中的fail-fast机制.2016-05-05


最新评论