欢迎来到徐庆高(Tea)的个人博客网站
磨难很爱我,一度将我连根拔起。从惊慌失措到心力交瘁,我孤身一人,但并不孤独无依。依赖那些依赖我的人,信任那些信任我的人,帮助那些给予我帮助的人。如果我愿意,可以分裂成无数面镜子,让他们看见我,就像看见自己。察言观色和模仿学习是我的领域。像每个深受创伤的人那样,最终,我学会了随遇而安。
当前位置: 日志文章 > 详细内容

mybatis 动态SQL巧用突破in数量限制的方案

2025年07月29日 Java
痛点oracle 11g 只能in1000个条件,大数据量无法处理功能说明用于解决数据库 in 子句参数数量限制问题(如 oracle 的 1000 元素限制),通过动态分块生成多组 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>

语法逐层解析

  1. 外层条件判断
    <if test="piids != null and piids.size > 0">
  2. trim 标签清理
    <trim suffixoverrides=" or t0.processinstid in()">
    解决的问题:消除最后一块可能残留的无效语句
    机制:自动删除结尾匹配的指定字符串
  3. 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 列表限制调整方案
oracle1000保持现有代码:index % 1000 == 999
(索引从0开始,第1000个元素时分块)
sql server2100修改为:index % 2100 == 2099
(索引达到2099时触发分块)
mysql无硬性限制移除分块逻辑,直接逗号连接所有元素
postgresql无硬性限制移除分块逻辑,直接逗号连接所有元素

补充说明:

  1. oracle/sql server 分块逻辑

    • 因数据库对 in 子句的表达式数量有严格限制,需通过模运算 (%) 控制分块节点。
    • 公式:index % n == (n-1),其中 n 为数据库允许的最大值(oracle=1000,sql server=2100)。
  2. mysql/postgresql 优化

    • 可直接简化为:
      <foreach collection="piids" item="item" open="(" close=")" separator=",">
          #{item}
      </foreach>
      

到此这篇关于mybatis 动态sql巧用突破in数量限制的文章就介绍到这了,更多相关mybatis in数量限制内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!