From d02571d59633367ac76b7f58ab38584698b1aa1b Mon Sep 17 00:00:00 2001
From: ludc
Date: 星期四, 17 十月 2024 09:55:37 +0800
Subject: [PATCH] 高级查询中增加范围查询功能

---
 Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/MybatisParameterUtil.java |  153 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 152 insertions(+), 1 deletions(-)

diff --git a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/MybatisParameterUtil.java b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/MybatisParameterUtil.java
index 457dbdb..5f9e2f6 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/MybatisParameterUtil.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/MybatisParameterUtil.java
@@ -1,21 +1,134 @@
 package com.vci.ubcs.starter.util;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.vci.ubcs.starter.exception.VciBaseException;
+import org.springblade.core.mp.support.SqlKeyword;
+import org.springblade.core.tool.utils.BeanUtil;
 import org.springframework.util.ObjectUtils;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
- * in 鍙傛暟鎴彇锛岃繑鍥瀢rapper
+ * in 鍙傛暟鎴彇锛岃繑鍥瀢rapper/鎴栬�厀here鏉′欢瀛楃涓�
  *
  * @author ludc
  * @date 2023/5/5
  */
 public class MybatisParameterUtil {
 
+	/**
+	 * Oracle IN 鏌ヨ鐨勬渶澶у弬鏁伴檺鍒�
+ 	 */
+	private static final int MAX_IN_CLAUSE_SIZE = 1000;
+
+	/**
+	 * 灏嗙粰瀹氱殑 ID 鍒楄〃杞崲涓洪�傚悎 Oracle 鐨勬煡璇㈡潯浠�
+	 *
+	 * @param ids ID 鍒楄〃
+	 * @return 閫傚悎 Oracle 鐨勬煡璇㈡潯浠�
+	 */
+	public static String convertToOrConditions(String filed,List<String> ids) {
+		if (ids == null || ids.isEmpty()) {
+			return "";
+		}
+
+		StringBuilder queryBuilder = new StringBuilder();
+		int size = ids.size();
+
+		// 鍒嗘壒澶勭悊锛岄伩鍏嶈秴杩� Oracle IN 鏌ヨ鐨勬渶澶ч檺鍒�
+		for (int i = 0; i < size; i += MAX_IN_CLAUSE_SIZE) {
+			int end = Math.min(i + MAX_IN_CLAUSE_SIZE, size);
+			List<String> subList = ids.subList(i, end);
+			if (queryBuilder.length() > 0) {
+				queryBuilder.append(" OR ");
+			}
+			queryBuilder.append("(")
+				.append(getInClause(filed,subList)).append(")");
+		}
+
+		return queryBuilder.toString();
+	}
+
+	 /*
+	 * 鑾峰彇 IN 鏌ヨ鏉′欢瀛楃涓�
+	 * @param ids ID 鍒楄〃
+	 * @return IN 鏌ヨ鏉′欢瀛楃涓�
+	 */
+	private static String getInClause(String filed,List<String> ids) {
+		StringBuilder inClauseBuilder = new StringBuilder();
+		inClauseBuilder.append(filed + " IN (");
+
+		for (int i = 0; i < ids.size(); i++) {
+			inClauseBuilder.append("'").append(ids.get(i)).append("'");
+			if (i < ids.size() - 1) {
+				inClauseBuilder.append(", ");
+			}
+		}
+		inClauseBuilder.append(")");
+
+		return inClauseBuilder.toString();
+	}
+
+	/**
+	 * 鑾峰彇 IN 鏌ヨ鏉′欢瀛楃涓诧紙涓嶅寘鍚玦n锛�
+	 *
+	 * @param ids ID 鍒楄〃
+	 * @return IN 鏌ヨ鏉′欢瀛楃涓�
+	 */
+	public static String getInClause(List<String> ids) {
+		StringBuilder inClauseBuilder = new StringBuilder();
+		for (int i = 0; i < ids.size(); i++) {
+			inClauseBuilder.append("'").append(ids.get(i)).append("'");
+			if (i < ids.size() - 1) {
+				inClauseBuilder.append(", ");
+			}
+		}
+		return inClauseBuilder.toString();
+	}
+
+	/**
+	 * in浣滀负鏌ヨ鏉′欢鏃讹紝闃叉澶т簬1000鍑虹幇鎶ラ敊锛屽鏉′欢杩涜鎴彇锛岃繛琛ㄦ煡璇㈢殑wrapper
+	 * @param wrapper MPJLambdaWrapper,涓嶈繘琛岃繛琛ㄦ煡璇㈡椂浣跨敤
+	 * @param column 浣滀负in鐨勬潯浠跺垪
+	 * @param coll 鏌ヨ鍙傛暟
+	 * @param <T> LambdaQueryWrapper鐨勬硾鍨�
+	 * @param <F> 鏌ヨ鍙傛暟绫诲瀷
+	 * @return
+	 * @throws VciBaseException
+	 */
+	public static <T, F> MPJLambdaWrapper<T> cutInParameter(MPJLambdaWrapper<T> wrapper, SFunction<T, ?> column, List<F> coll) throws VciBaseException {
+		List<List<F>> newList = splitList(coll, 900);
+		if (ObjectUtils.isEmpty(newList)) {
+			throw new VciBaseException("鍙傛暟閿欒");
+		} else if (newList.size() == 1) {
+			wrapper.in(column, newList.get(0));
+			return wrapper;
+		}
+		wrapper.and(i -> {
+			i.in(column, newList.get(0));
+			newList.remove(0);
+			for (List<F> objects : newList) {
+				i.or().in(column, objects);
+			}
+		});
+		return wrapper;
+	}
+
+	/**
+	 * in浣滀负鏌ヨ鏉′欢鏃讹紝闃叉澶т簬1000鍑虹幇鎶ラ敊锛屽鏉′欢杩涜鎴彇锛屼笉鍏峰杩炶〃鏌ヨ鐨剋rapper
+	 * @param wrapper LambdaQueryWrapper,涓嶈繘琛岃繛琛ㄦ煡璇㈡椂浣跨敤
+	 * @param column 浣滀负in鐨勬潯浠跺垪
+	 * @param coll 鏌ヨ鍙傛暟
+	 * @param <T> LambdaQueryWrapper鐨勬硾鍨�
+	 * @param <F> 鏌ヨ鍙傛暟绫诲瀷
+	 * @return
+	 * @throws VciBaseException
+	 */
 	public static <T, F> LambdaQueryWrapper<T> cutInParameter(LambdaQueryWrapper<T> wrapper, SFunction<T, ?> column, List<F> coll) throws VciBaseException {
 		List<List<F>> newList = splitList(coll, 900);
 		if (ObjectUtils.isEmpty(newList)) {
@@ -34,6 +147,44 @@
 		return wrapper;
 	}
 
+	/**
+	 * notin浣滀负鏌ヨ鏉′欢鏃讹紝闃叉澶т簬1000鍑虹幇鎶ラ敊锛屽鏉′欢杩涜鎴彇锛岃繛琛ㄦ煡璇㈢殑wrapper
+	 * @param wrapper MPJLambdaWrapper,涓嶈繘琛岃繛琛ㄦ煡璇㈡椂浣跨敤
+	 * @param column 浣滀负in鐨勬潯浠跺垪
+	 * @param coll 鏌ヨ鍙傛暟
+	 * @param <T> LambdaQueryWrapper鐨勬硾鍨�
+	 * @param <F> 鏌ヨ鍙傛暟绫诲瀷
+	 * @return
+	 * @throws VciBaseException
+	 */
+	public static <T, F> MPJLambdaWrapper<T> cutNotInParameter(MPJLambdaWrapper<T> wrapper, SFunction<T, ?> column, List<F> coll) throws VciBaseException {
+		List<List<F>> newList = splitList(coll, 900);
+		if (ObjectUtils.isEmpty(newList)) {
+			throw new VciBaseException("鍙傛暟閿欒");
+		} else if (newList.size() == 1) {
+			wrapper.notIn(column, newList.get(0));
+			return wrapper;
+		}
+		wrapper.and(i -> {
+			i.in(column, newList.get(0));
+			newList.remove(0);
+			for (List<F> objects : newList) {
+				i.or().notIn(column, objects);
+			}
+		});
+		return wrapper;
+	}
+
+	/**
+	 * notin浣滀负鏌ヨ鏉′欢鏃讹紝闃叉澶т簬1000鍑虹幇鎶ラ敊锛屽鏉′欢杩涜鎴彇锛屼笉鍏峰杩炶〃鏌ヨ鐨剋rapper
+	 * @param wrapper LambdaQueryWrapper,涓嶈繘琛岃繛琛ㄦ煡璇㈡椂浣跨敤
+	 * @param column 浣滀负in鐨勬潯浠跺垪
+	 * @param coll 鏌ヨ鍙傛暟
+	 * @param <T> LambdaQueryWrapper鐨勬硾鍨�
+	 * @param <F> 鏌ヨ鍙傛暟绫诲瀷
+	 * @return
+	 * @throws VciBaseException
+	 */
 	public static <T, F> LambdaQueryWrapper<T> cutNotInParameter(LambdaQueryWrapper<T> wrapper, SFunction<T, ?> column, List<F> coll) throws VciBaseException {
 		List<List<F>> newList = splitList(coll, 900);
 		if (ObjectUtils.isEmpty(newList)) {

--
Gitblit v1.9.3