mybatis in查詢條件過長的解決方案
更新時間:2021年10月09日 17:01:24 作者:遙遙晚風點點
這篇文章主要介紹了mybatis in查詢條件過長的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
mybatis in查詢條件過長的解決
方法1:分次查詢,將參數(shù)且分割成多個短的查詢后合并
代碼:
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; //(先計算出余數(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這種方法會報錯;
論證如下

解決辦法
<foreach collection="array" item="item" index="index" open="(" close=")" separator=",">
<if test="(index % 999) == 998"> NULL ) OR DOC.ID IN (</if>#{item}
</foreach>
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
springboot整合@Retryable實現(xiàn)重試功能的示例代碼
本文主要介紹了springboot整合@Retryable實現(xiàn)重試功能的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-05-05
springboot+jersey+tomcat實現(xiàn)跨域方式上傳文件到服務器的方式
這篇文章主要介紹了springboot+jersey+tomcat實現(xiàn)跨域方式上傳文件到服務器,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03
Spring boot整合shiro+jwt實現(xiàn)前后端分離
這篇文章主要為大家詳細介紹了Spring boot整合shiro+jwt實現(xiàn)前后端分離,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-12-12
SpringBoot如何使用自定義注解實現(xiàn)接口限流
這篇文章主要介紹了SpringBoot如何使用自定義注解實現(xiàn)接口限流,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
解析JAVA中 maven pom.xml 和 properties
這篇文章主要介紹了JAVA中 maven pom.xml 和 properties 配置文件、spring 配置文件及環(huán)境變量的關系,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2025-05-05

