吉安感知网项目-后端
xiebin
2026-01-06 d207a86cdf1ab52ef8cb7cd83bad8fceab8038cf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
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<T> {
    /**
     * 解析实体类字段的注解,动态构建查询条件
     */
    public static <T> QueryWrapper<T> buildQueryConditions(QueryWrapper<T> 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 <T> void applyCondition(QueryWrapper<T> 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);
        }
    }
 
}