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 QueryWrapper build(T t) { QueryWrapper queryWrapper = new QueryWrapper(); if (t == null) return queryWrapper; QueryWrapper[] 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[], String, Object>> whereMap = new HashMap[], 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 { void invoke(P1 p1, P2 p2, P3 p3); }