一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - mybatis in查詢條件過長的解決方案

mybatis in查詢條件過長的解決方案

2022-02-13 14:46遙遙晚風點點 Java教程

這篇文章主要介紹了mybatis in查詢條件過長的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

mybatis in查詢條件過長的解決

方法1:分次查詢,將參數且分割成多個短的查詢后合并

代碼:

?
1
2
3
4
5
6
7
8
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等分方法方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

?
1
2
3
4
5
6
7
8
9
10
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邏輯:

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

mybatis大于1000的in查詢的解決

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

?
1
2
3
4
5
6
7
8
9
<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這種方法會報錯;

論證如下

mybatis in查詢條件過長的解決方案

解決辦法

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

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/Mr_ye931/article/details/106102695

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 私人家庭影院5577 | 男女视频在线观看 | 天干夜天天夜天干天ww | 黄色大片免费网站 | 日韩毛片免费线上观看 | 欧美国产合集在线视频 | 勾搭已婚高h | 日韩一区二区三 | 太紧太深了受不了黑人 | 国产精品免费看久久久香蕉 | 白丝女榨干蹂躏我 | 日韩精品1 | 小鸟酱在线看 | 校园全黄h全肉细节文 | 手机看片福利盒子久久 | 免费视频大全 | 日本人黄色| 国产伊人久久 | 国产大片线上免费观看 | 果冻传媒第一二三专区 | 国产亚洲精品一区二区在线播放 | 成熟女人50岁一级毛片不卡 | 男女xxoo做爰猛烈动态一 | 欧美色图亚洲 | 国产成人无精品久久久 | 无限国产资源 | 亚洲精品国产成人7777 | 亚洲 欧美 偷自乱 图片 | 亚洲欧美自偷自拍另类小说 | 九九大香尹人视频免费 | 天使萌痴汉在线中文字幕 | 忘忧草秋观看未满十八 | 国产一区二区在线观看美女 | 岛国片免费观看 | 亚洲成人看片 | 波多野结衣xxxx性精品 | m3u8久久国产精品影院 | 小苹果日本在线观看 | 草草在线免费视频 | 日本精品久久久久中文字幕 1 | 亚洲色图欧美图片 |