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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费看国产精品久久久久 | 成人在线小视频 | 国产精品四虎在线观看免费 | 无人视频在线观看完整版高清 | 特级毛片全部免费播放器 | 特黄一级 | 四虎现在的网址入口2022 | 视频在线播放 | 国产二区视频 | 波多野结衣久久国产精品 | yy6080午夜国产免费福利 | 午夜办公室 | 国产精品制服丝袜白丝www | 99在线资源 | 亚洲国产精品日本无码网站 | 青青草亚洲 | 美女被吸乳老师羞羞漫画 | 欧美女孩13一14v | 无码乱人伦一区二区亚洲一 | 四虎永久成人免费 | 亚洲国产成人精品无码区99 | 丝袜护士强制脚足取精 | 九九精品视频在线观看九九 | 欧美性色欧美a在线播放 | 问一问免费咨询 | a毛片免费观看完整 | 亚洲精品乱码蜜桃久久久 | 四虎永久免费地址ww417 | 日韩亚洲欧美一区二区三区 | 亚洲精品成人a | 97福利社 | 9自拍视频在线观看 | 国产精品人人视频 | 小浪妇奶真大水多 | 国产精品不卡 | 国内免费高清视频在线观看 | 色妞视频一级毛片 | 国产精品视频免费观看 | 成年人免费看的视频 | 久久成人伊人欧洲精品AV | 四虎地址 |