日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Oracle报错】ORA-01795: 列表中的最大表达式数为 1000 问题解决(使用JDK8的 stream 实现)

發布時間:2024/10/6 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Oracle报错】ORA-01795: 列表中的最大表达式数为 1000 问题解决(使用JDK8的 stream 实现) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 問題說明

-- 類似這種 SQL SELECT * FROM tableName WHERE tableField IN ('','')

姑且不說這種 SQL 的效率和可優化和替代性,就當前問題在 MySQL、Greenplum 數據庫沒有 1000 的限制。

2. 解決方法

解決的方法較多,這里使用的是 JDK8 的 stream 方法,代碼如下:

/*** 通過 List 數據獲取 inStr 字符串(超過 1000 個改成 or in)** @param list List對象* @return inStr 字符串*/private String getInStrByList(List<Map<String, Object>> list) {int listSize = list.size();List<Map<String, Object>> tempRecordList;// 分段大小(這個數值可以寫成參數傳遞過來)int lengthControl = 1000;List<String> inStrSegmentList = new ArrayList<>();if (listSize <= lengthControl) {return list.stream().map(oneMap-> MapUtils.getString(oneMap, "fieldName")).collect(Collectors.joining("','", " table_field in ( '", "' ) "));} else {// 進行分段double number = listSize * 1.0 / lengthControl;int n = ((Double) Math.ceil(number)).intValue();for (int i = 0; i < n; i++) {int iLength = i * lengthControl;int end = lengthControl * (i + 1);if (end > listSize) {end = listSize;}tempRecordList = list.subList(iLength, end);String inStrSegment = tempRecordList.stream().map(oneMap -> MapUtils.getString(oneMap, "fieldName")).collect(Collectors.joining("','", "'", "'"));inStrSegmentList.add(inStrSegment);}}return inStrSegmentList.stream().collect(Collectors.joining(" ) or table_field in ( "," ( table_field in ( "," ) )"));}

字符串的使用舉例:

<select id="geDataList" parameterType="java.util.Map" resultType="java.util.Map">SELECT * FROM table_name<where><if test="inStr != null and inStr != ''">AND ${inStr}</if></where></select>

總結

以上是生活随笔為你收集整理的【Oracle报错】ORA-01795: 列表中的最大表达式数为 1000 问题解决(使用JDK8的 stream 实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。