mybatis in查询条件过长的解决方案

目录
  • mybatis in查询条件过长的解决
    • 方法1:分次查询,将参数且分割成多个短的查询后合并
    • 方法2:xml文件中编写sql
  • mybatis大于1000的in查询的解决
    • 论证如下
    • 解决办法

mybatis in查询条件过长的解决

方法1:分次查询,将参数且分割成多个短的查询后合并

代码:

      int splitNum =(int) Math.ceil( (float) ids.length/999); //切片数量
      List<String> itemIdList = new ArrayList<>(Arrays.asList(ids));
      List<List<String>> splitList = averageAssign(itemIdList, splitNum);
      for (List<String> list : splitList) {
       param.put("itemIds",list);
       List<Map<Object, Object>> itemStatisticsList = iProcessExtMapper.getItemStatisticsList(param);
       result.addAll(itemStatisticsList);
      }

将list分成N等分方法方法:

 public static <T> List<List<T>> averageAssign(List<T> source,int n){
  List<List<T>> result=new ArrayList<List<T>>();
  int remaider=source.size()%n;  //(先计算出余数)
  int number=source.size()/n;  //然后是商
  int offset=0;//偏移量
  for(int i=0;i<n;i++){
   List<T> value=null;
   if(remaider>0){
    value=source.subList(i*number+offset, (i+1)*number+offset+1);
    remaider--;
    offset++;
   }else{
    value=source.subList(i*number+offset, (i+1)*number+offset);
   }
   result.add(value);
  }
  return result;
 }

方法2:xml文件中编写sql

i.id in
 <foreach collection="itemIds" index="index" item="item" open="(" close=")">
 <if test="index != 0">
   <choose>
   <when test="index % 1000 == 999"> ) OR ID IN( </when>
                 <otherwise>,</otherwise>
   </choose>
 </if>
   #{item}
 </foreach> 

sql逻辑:

ID IN(ids[0],ids[1]+...+ids[998])OR ID IN (ids[999],ids[1000],...ids[max])

mybatis大于1000的in查询的解决

之前公司一位同事写的方法:

<select id="getByDirIds" parameterType="string" resultMap="dirDocLinkMap">
        SELECT
        <include refid="columns"/>
        FROM KM_DIR_DOC_LINK T
        WHERE T.DIR_ID IN
        <foreach collection="array" index="index" open="(" close=")" item="item" separator=",">
            <if test="(index % 1000) == 999">NULL) OR T.DIR_ID IN (</if>#{item}
        </foreach>
    </select>

但是随着数据量增加,发现大于2000这种方法会报错;

论证如下

解决办法

<foreach collection="array" item="item" index="index" open="(" close=")" separator=",">
                <if test="(index % 999) == 998"> NULL ) OR DOC.ID IN (</if>#{item}
            </foreach>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Mybatis plus中使用in查询出错如何解决

    不想看我bb的直接点上面的 ''解决方法'' 我的情况是这样的,在使用mybatis plus提供的QueryWrapper方法里的in查询时,我的参数为类似"1,2,3,4"这样的字符串 //要查的参数 String masterIds = "81554,5654,55948,48945"; QueryWrapper<FpjyPauperInfo> pauperqw = new QueryWrapper<>(); pauperqw.in(&

  • mybatis使用foreach语句实现IN查询(三种)

    foreach语句中, collection属性的参数类型可以使:List.数组.map集合 collection: 必须跟mapper.java中@Param标签指定的元素名一样 item : 表示在迭代过程中每一个元素的别名,可以随便起名,但是必须跟元素中的#{}里面的名称一样. index :表示在迭代过程中每次迭代到的位置(下标) open :前缀, sql语句中集合都必须用小括号()括起来 close :后缀 separator :分隔符,表示迭代时每个元素之间以什么分隔 Mybati

  • mybatis 查询sql中in条件用法详解(foreach)

    foreach属性主要有item,index,collection,open,separator,close 1.item表示集合中每一个元素进行迭代时的别名, 2.index指定一个名字,用于表示在迭代过程中,每次迭代到的位置, 3.open表示该语句以什么开始, 4.separator表示在每次进行迭代之间以什么符号作为分隔符, 5.close表示以什么结束, 6.collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的, 主要有一下3种情况: a.如果传入的是单

  • Mybatis使用IN语句查询的实现

    一.简介 在SQL语法中如果我们想使用in的话直接可以像如下一样使用: select * from HealthCoupon where useType in ( '4' , '3' ) 但是如果在MyBatis中的使用in的话,像如下去做的话,肯定会报错: Map<String, Object> selectByUserId(@Param("useType") String useType) <select id="selectByUserId"

  • mybatis in查询条件过长的解决方案

    目录 mybatis in查询条件过长的解决 方法1:分次查询,将参数且分割成多个短的查询后合并 方法2:xml文件中编写sql mybatis大于1000的in查询的解决 论证如下 解决办法 mybatis in查询条件过长的解决 方法1:分次查询,将参数且分割成多个短的查询后合并 代码: int splitNum =(int) Math.ceil( (float) ids.length/999); //切片数量 List<String> itemIdList = new ArrayList

  • 存储过程实现(可带查询条件/万能分页/通用)

    假设数据库中有张表,表名是UserName,字段分别是ID(int),Name(nvarchar),Age(int). 如果不带查询条件存储过程是: 复制代码 代码如下: CREATE PROCEDURE [dbo].[UserName] @pageIndex int, @pageSize int AS declare @min int; declare @max int; set @min=@pageSize*(@pageIndex-1)+1; set @max=@pageSize*@page

  • mybatis collection 多条件查询的实现方法

    mybatis collection 多条件查询的实现方法 前言: 业务需要通过mybatis 查询返回嵌套集合,嫌多次查询太麻烦,用自带的高级查询解决问题,下边是代码,已测试通过. 说下自己的理解,就是一个主查询结果集里面嵌套了子查询的结果集,可以是多个子查询,每个子查询的条件从主查询结果集中获取,返回值各自定义.collection 标签的property是主查询里面集合的名字,如果有多个就再写个collection,column是子查询参数,单参数直接写主查询结合返回结果,例如直接写上us

  • 利用MyBatis进行不同条件的like模糊查询的方法

    之前一直是用MyBatis进行SQL查询时,一般都是用Generator逆向生产的代码来进行查询. 现在遇到了一个业务问题,我们需要进行对不同的条件分别进行模糊查询,首先我想到的就是根据对需要进行模糊查询的字段进行判断,然后调用Example的方式进行查询条件的注入. 对于String类型的数据可以有Like查询这个方法,但是Integer或者Long这种数据类型的话就没有了,得需要自己动手写. 但是呢,我利用Generator生成的代码Example方式进行模糊查询时确无法实现,原因不太清楚,

  • Mybatis有查询结果但存不进实体类的解决方案

    问题描述 使用Mybatis查询得到实体类 表定义如下 成员ID 成员姓名 member_id member_name 对应的实体类如下 public class Member { private Integer memberId; private String memberName; // 省略getter和setter } 对应的Mapper.xml如下 <select id="selectMemberByMemberName" resultType="Member

  • Mybatis 实现动态组装查询条件,仿SQL模式

    目的: 以前比较习惯使用Hibernate,后来觉得mybatis不能按我想要的自动组装为SQL查询条件,所以提供该工具类: 效果图: 如图所示,根据条件自动组装查询条件,下面来说一下实现方法: 1. ServiceImpl书写注意项 Page<SysLogin> resultPage = null; try { PageHelper.startPage(pager.getCurrentPage(), pager.getPageSize()); // 判断是否有分页 if (ObjectHel

  • Mybatis查询条件包含List的情况说明

    目录 查询条件包含List的情况 在mybatis中查询的语句 查询条件带List和其他类型字段 需求 查询条件包含List的情况 在mybatis中进行搜索时,有时候参数中包含了List,比如传入参数: public class FileRequest{ //文件类型 private Integer fileType; //状态 private List<Status> statusList; } public class Status{ //注册状态 private Integer reg

  • MyBatis中多条件查询商品的三种方法及区别

    目录 一.Sql语句设置多个参数有几种方式 二.代码附上 一.Sql语句设置多个参数有几种方式 1.散装参数:需要使用@Param标记Sql语句中占位符处的名称例如 #{name} 2.实体类封装参数 只需要保证Sql中的参数名和实体类属性名对应上,即可设置成功BrandMapper.xml中的SQL语句不用动,把TestBrandMapper中的代码修改即可 3.Map集合 只需要保证Sql中的参数名和Map集合的键的名称对应上,即可设置成功.BrandMapper.xml中Sql语句不用改

  • mybatis plus实现条件查询

    目录 一.wapper介绍 二.常用的条件方法 1. gt 表示 > 2. le 表示 <= 3. lt 表示 < 4. isNull 表示 查询值为null 5. isNotNull 表示 查询值为不为null 6. eq 表示 = 7. ne 表示 != 8. between 表示 在范围之间,包含边界值 9. notBetween 表示 在范围之外,不含边界值 10. notBetween 表示 在范围之外,不含边界值 11. allEq 多条件查询 12. .链式编程,多条件查询

  • Mybatis collection查询集合属性报错的解决方案

    目录 Mybatis collection查询集合属性报错 错误日志 背景 排查 解决方法 MyBatis 包含属性为集合的查询 父实体类 关联子查询实体类 父查询返回结果实体类映射 集合子查询实体类映射 父查询 子查询 Mybatis collection查询集合属性报错 错误日志 org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, cla

随机推荐