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);
|
}
|