mybatis in查詢條件過長的解決方案
mybatis in查詢條件過長的解決
方法1:分次查詢,將參數(shù)且分割成多個(gè)短的查詢后合并
代碼:
int splitNum =(int) Math.ceil( (float) ids.length/999); //切片數(shù)量
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; //(先計(jì)算出余數(shù))
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>
但是隨著數(shù)據(jù)量增加,發(fā)現(xiàn)大于2000這種方法會(huì)報(bào)錯(cuò);
論證如下

解決辦法
<foreach collection="array" item="item" index="index" open="(" close=")" separator=",">
<if test="(index % 999) == 998"> NULL ) OR DOC.ID IN (</if>#{item}
</foreach>
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
最新Spring?Security實(shí)戰(zhàn)教程之表單登錄定制到處理邏輯的深度改造(最新推薦)
本章節(jié)介紹了如何通過Spring Security實(shí)現(xiàn)從配置自定義登錄頁面、表單登錄處理邏輯的配置,并簡單模擬了前后分離的適配方案,本章節(jié)我們將Spring?Security?默認(rèn)表單進(jìn)行登錄定制到處理邏輯的深度改造,感興趣的朋友一起看看吧2025-03-03
mybaits-plus?lambdaQuery()?和?lambdaUpdate()?常見的使用方法
MyBatis-Plus是一個(gè)?MyBatis?(opens?new?window)的增強(qiáng)工具,在?MyBatis?的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生,這篇文章主要介紹了mybaits-plus?lambdaQuery()?和?lambdaUpdate()?比較常見的使用方法,需要的朋友可以參考下2023-01-01
Java基礎(chǔ)教程之對(duì)象的方法與數(shù)據(jù)成員
這篇文章主要介紹了Java基礎(chǔ)教程之對(duì)象的方法與數(shù)據(jù)成員,本文講解對(duì)象的方法與數(shù)據(jù)成員相關(guān)知識(shí),因?yàn)閖ava是面向?qū)ο笳Z言,本文的知識(shí)都是經(jīng)常要用到的,需要的朋友可以參考下2014-08-08
Java如何使用Optional與Stream取代if判空邏輯(JDK8以上)
這篇文章主要給大家介紹了關(guān)于Java如何使用Optional與Stream取代if判空邏輯(JDK8以上)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Java使用Optional實(shí)現(xiàn)優(yōu)雅避免空指針異常
空指針異常(NullPointerException)可以說是Java程序員最容易遇到的問題了。為了解決這個(gè)問題,Java?8?版本中推出了?Optional?類,本文就來講講如何使用Optional實(shí)現(xiàn)優(yōu)雅避免空指針異常吧2023-03-03

