当前位置: 代码网 > it编程>编程语言>Java > mybatis 动态SQL巧用突破in数量限制的方案

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数量限制内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网! 

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com