您好,登錄后才能下訂單哦!
怎么解決mybatis in查詢條件過(guò)長(zhǎng)的問(wèn)題,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
代碼:
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; }
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])
之前公司一位同事寫的方法:
<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>
關(guān)于怎么解決mybatis in查詢條件過(guò)長(zhǎng)的問(wèn)題問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。