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