【Oracle报错】ORA-01795: 列表中的最大表达式数为 1000 问题解决(使用JDK8的 stream 实现)
生活随笔
收集整理的這篇文章主要介紹了
【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 实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Greenplum代码】记录一次不了解
- 下一篇: 【Java代码】道格拉斯-普克 Doug