package org.sxkj.common.query; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.enums.SqlKeyword; import java.lang.reflect.Field; import java.util.Arrays; import java.util.Collection; public class QueryUtils { /** * 解析实体类字段的注解,动态构建查询条件 */ public static QueryWrapper buildQueryConditions(QueryWrapper queryWrapper, Object paramObj) { Class clazz = paramObj.getClass(); for (Field field : clazz.getDeclaredFields()) { QueryCondition queryCondition = field.getAnnotation(QueryCondition.class); if (queryCondition == null) { continue; } field.setAccessible(true); try { SqlKeyword sqlKeyWord = queryCondition.type(); Object value = field.get(paramObj); if (queryCondition.ignore() || (value == null && !Arrays.asList(SqlKeyword.IS_NULL, SqlKeyword.IS_NOT_NULL, SqlKeyword.EXISTS, SqlKeyword.NOT_EXISTS) .contains(sqlKeyWord))) { continue; } String column = queryCondition.column().isEmpty() ? field.getName().replaceAll("([a-z])([A-Z])", "$1_$2").toLowerCase() : queryCondition.column(); applyCondition(queryWrapper, column, value, sqlKeyWord); } catch (IllegalAccessException e) { throw new RuntimeException("Failed to apply query condition for field: " + field.getName(), e); } } return queryWrapper; } /** * 应用查询条件,完全适配SqlKeyword枚举类型 */ private static void applyCondition(QueryWrapper queryWrapper, String column, Object value, SqlKeyword conditionType) { switch (conditionType) { // 等于 case EQ: queryWrapper.eq(column, value); break; // 不等于 case NE: queryWrapper.ne(column, value); break; // 大于 case GT: queryWrapper.gt(column, value); break; // 小于 case LT: queryWrapper.lt(column, value); break; // 大于等于 case GE: queryWrapper.ge(column, value); break; // 小于等于 case LE: queryWrapper.le(column, value); break; // 全模糊匹配 case LIKE: queryWrapper.like(column, value); break; // 不匹配 case NOT_LIKE: queryWrapper.notLike(column, value); break; // IN查询 case IN: if (value instanceof Collection && !((Collection) value).isEmpty()) { queryWrapper.in(column, (Collection) value); } break; // NOT IN查询 case NOT_IN: if (value instanceof Collection && !((Collection) value).isEmpty()) { queryWrapper.notIn(column, (Collection) value); } break; // BETWEEN查询 case BETWEEN: if (value instanceof Collection && ((Collection) value).size() == 2) { Object[] betweenValues = ((Collection) value).toArray(); if (betweenValues[0] != null && betweenValues[1] != null) { queryWrapper.between(column, betweenValues[0], betweenValues[1]); } } break; // NOT BETWEEN查询 case NOT_BETWEEN: if (value instanceof Collection && ((Collection) value).size() == 2) { Object[] betweenValues = ((Collection) value).toArray(); if (betweenValues[0] != null && betweenValues[1] != null) { queryWrapper.notBetween(column, betweenValues[0], betweenValues[1]); } } break; // IS NULL case IS_NULL: queryWrapper.isNull(column); break; // IS NOT NULL case IS_NOT_NULL: queryWrapper.isNotNull(column); break; // EXISTS (需要特殊处理,value应为子查询) case EXISTS: if (value instanceof String) { queryWrapper.exists((String) value); } break; // NOT EXISTS (需要特殊处理,value应为子查询) case NOT_EXISTS: if (value instanceof String) { queryWrapper.notExists((String) value); } break; // 默认等于条件 default: queryWrapper.eq(column, value); } } }