zj
2025-01-06 0e7b38c2b3af72ea2a7f8a2fcbaad4d78e2c1977
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
package com.gear.common.builder;
 
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.gear.common.annotation.Where;
import com.gear.common.enums.Condition;
import lombok.extern.slf4j.Slf4j;
 
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
 
@Slf4j
public class WhereBuilder {
 
    private WhereBuilder() {
    }
 
    public static <T> QueryWrapper<T> build(T t) {
        QueryWrapper<T> queryWrapper = new QueryWrapper();
        if (t == null) return queryWrapper;
 
        QueryWrapper<T>[] queryWrapperArr = new QueryWrapper[]{queryWrapper};
        Class<?> tc = t.getClass();
        Stream.of(tc.getDeclaredFields())
                .peek(field -> field.setAccessible(true))
                .filter(field -> {
                    try {
                        return field.get(t) != null
                                && field.getAnnotation(Where.class) != null;
                    } catch (IllegalAccessException e) {
                        log.error("获取字段时异常:", e);
                        return false;
                    }
                })
                .forEach(field -> {
                    try {
                        Where where = field.getAnnotation(Where.class);
                        Condition condition = where.value();
                        String column = where.column();
                        Object value = field.get(t);
                        whereMap.get(condition).invoke(queryWrapperArr, column, value);
                    } catch (Exception e) {
                        log.error("执行条件拼接时异常:", e);
                    }
                });
        return queryWrapperArr[0];
    }
 
    private static Map<Condition, Con3<QueryWrapper<?>[], String, Object>> whereMap = new HashMap<Condition, Con3<QueryWrapper<?>[], String, Object>>() {{
        put(Condition.eq, (queryWrapperArr, column, value) -> queryWrapperArr[0] = queryWrapperArr[0].eq(column, value));
        put(Condition.ne, (queryWrapperArr, column, value) -> queryWrapperArr[0] = queryWrapperArr[0].ne(column, value));
        put(Condition.lt, (queryWrapperArr, column, value) -> queryWrapperArr[0] = queryWrapperArr[0].lt(column, value));
        put(Condition.le, (queryWrapperArr, column, value) -> queryWrapperArr[0] = queryWrapperArr[0].le(column, value));
        put(Condition.gt, (queryWrapperArr, column, value) -> queryWrapperArr[0] = queryWrapperArr[0].gt(column, value));
        put(Condition.ge, (queryWrapperArr, column, value) -> queryWrapperArr[0] = queryWrapperArr[0].ge(column, value));
        put(Condition.like, (queryWrapperArr, column, value) -> queryWrapperArr[0] = queryWrapperArr[0].like(column, value));
        put(Condition.likeLeft, (queryWrapperArr, column, value) -> queryWrapperArr[0] = queryWrapperArr[0].likeLeft(column, value));
        put(Condition.likeRight, (queryWrapperArr, column, value) -> queryWrapperArr[0] = queryWrapperArr[0].likeRight(column, value));
    }};
}
 
@FunctionalInterface
interface Con3<P1, P2, P3> {
    void invoke(P1 p1, P2 p2, P3 p3);
}