使用注解实现动态配置查询条件(一)

时间:2025-05-07 14:14:56

       由于很多查询条件都有共性,而且都是重复的工作,所以自定义了注解,来实现动态查询的功能,这个是最简单的查询 ,后面有时间再扩展。主要用到以下的注解和相关的类(简单记录,后期再整理):

1、

@Data
public class BaseQuery {
    /**
     * 页码
     */
    private int pageNo = 1;
    /**
     * 每页行数
     */
    private int pageSize = 1000;
    /**
     * 排序字段
     */
    private String sort;
    /**
     * 排序方式
     */
    private String direction = "asc";
}

2、

public class BaseMapper<T> {
    /**
     * 领料单基本信息
     */
    @Autowired
    protected Mapper<T> mapper;
}

3、


public class BaseForQuery<T> extends BaseMapper<T> {

    /**
     * 获取没有特殊操作的查询条件
     *
     * @param queryParams 查询的参数
     * @param entityObj   实体对象
     * @return 返回查询的对象
     */
    protected static <K extends BaseQuery, V> Example getExample(final K queryParams, final Class<V> entityObj) {
        final Example example = new Example(entityObj, false);
        if (queryParams == null) {
            return example;
        }
        // 数据库对象的字段
        final Map<String, Annotation[]> hashMapDb = (entityObj);
        if (hashMapDb == null || (())) {
            return example;
        }
        // 排序
        (queryParams, example, hashMapDb);
        // 条件
        (example, queryParams, hashMapDb);
        return example;
    }

    /**
     * 设置 条件
     *
     * @param example     条件
     * @param queryParams 请求参数
     * @param hashMapDb   数据库
     */
    private static <K extends BaseQuery> void getCondition(final Example example, final K queryParams,
                                                           final Map<String, Annotation[]> hashMapDb) {
        final  criteria = ();
        (criteria, queryParams, hashMapDb);
    }

    /**
     * 获取条件
     *
     * @param criteria  查询条件
     * @param hashMapDb 数据库字段
     */
    private static <K> void getCondition(final  criteria, final K queryParams
            , final Map<String, Annotation[]> hashMapDb) {
        final Field[] fields = ().getDeclaredFields();
        if (fields == null ||  == 0 || (queryParams)) {
            return;
        }
        for (final Field field : fields) {
            // 获取字段对应的值
            Object value;
            try {
                (true);
                value = (queryParams);
            } catch (final IllegalAccessException e) {
                continue;
            }
            if ((value)) {
                continue;
            }
            // 用数据库生成的字段名称,避免异常
            final String name = ();
            final Optional<String> optionalField = ().stream()
                    .filter(n -> (name)).findAny();
            if (!()) {
                continue;
            }
            final Condition condition = ();
            if (condition == null) {
                continue;
            }
            if (!(()) && ().getKey() == ) {
                value = (((), DateTimeFormatter
                        .ofPattern(())).atZone(()).toInstant());
            }
            switch (().getKey()) {
                case "Equals":
                    (name, value);
                    break;
                case "Like":
                    (name, ().concat("%"));
                    break;
                case "GreaterThan":
                    (name, value);
                    break;
                case "GreaterThanOrEqualTo":
                    (name, value);
                    break;
                case "LessThan":
                    (name, value);
                    break;
                case "LessThanOrEqualTo":
                    (name, value);
                    break;
                case "IsNotNull":
                    (name);
                    break;
                case "IsNull":
                    (name);
                    break;
                default:
                    break;
            }
        }

        (criteria, ().getSuperclass(), hashMapDb);
    }

    /**
     * 排序
     *
     * @param queryParams 请求参数
     * @param example     查询条件
     * @param hashMapDb   数据库的字段
     * @param <K>         泛型
     */
    private static <K extends BaseQuery> void setOrderBy(final K queryParams, final Example example, final Map<String, Annotation[]> hashMapDb) {
        if (!(())) {
            String sort = ();
            final Optional<String> optionalField = ().stream().filter(n ->
                    (())).findAny();
            if (()) {
                // 获取属性对应的字段
                sort = ();
                final Optional<Annotation> annotation = (hashMapDb
                        .get(sort)).filter(n -> n instanceof Column).findAny();
                if (()) {
                    final Column column = (Column) ();
                    sort = ();
                }
            }
            if ((())) {
                (sort);
            } else {
                ((" ").concat(()));
            }
        }
    }

    /**
     * 获取总行数和查询的条件
     *
     * @param queryParams 查询的请求参数
     * @param entityObj   实体对象
     * @param <K>         查询的请求参数 泛型对象
     * @param <V>         实体对象 泛型对象
     * @return 返回总的行数
     */
    protected <K extends BaseQuery, V> ResultInfo<List<T>, BaseSummary> getPagerData(final K queryParams, final Class<V> entityObj) {
        final Example example = (queryParams, entityObj);
        return (queryParams, example);
    }

    /**
     * 获取总行数和查询的条件
     *
     * @param queryParams 查询的请求参数
     * @param example     查询条件Example
     * @param <K>         查询的请求参数 泛型对象
     * @return 返回总的行数
     */
    protected <K extends BaseQuery> ResultInfo<List<T>, BaseSummary> getPagerData(final K queryParams, final Example example) {
        final ResultInfo resultInfo = new ResultInfo();
        final int count = (example);
        final BaseSummary baseSummary = new BaseSummary();
        (count);
        // 总条数
        (baseSummary);
        List<T> list = new ArrayList<>();
        if (() != 0) {
            // 明细数据
            final int pageNo = ();
            final int pageSize = ();
            final int offset = (pageNo - 1) * pageSize;
            final RowBounds rowBounds = new RowBounds(offset, pageSize);
            // 查询数据
            list = (example, rowBounds);
        }
        (list);

        return resultInfo;
    }

    /**
     * 返回分页之后的数据
     *
     * @param k   带有分页的信息
     * @param lst 列表
     * @param <K> 泛型
     * @return 返回分页之后的数据
     */
    protected static <K extends BaseQuery, V> List<V> getLists(final K k, final List<V> lst) {
        final int beginIndex = (() - 1) * ();
        int endIndex = () * ();
        if (() < endIndex) {
            endIndex = ();
        }
        return (beginIndex, endIndex);
    }

    /**
     * 排序
     *
     * @param forQuery 查询条件
     * @param example  example
     */
    protected <T extends BaseQuery> void setExampleOrderBy(final T forQuery, final Example example) {
        if (!(())) {
            if (!(()) && "desc".equalsIgnoreCase(())) {
                (()).desc();
            } else {
                (()).asc();
            }
        }
    }
}

4、


@Data
public class ResultInfo<T,E> {
/**
* 列表数据
*/
    private T detail;

/**
* 总条数
*/
    private E summary;
}

5、


@Data
public class BaseSummary {

/**
* 总条数
*/
    private long totalRows;
}

 6、

@Constraint(validatedBy = )
@Target({, , ElementType.ANNOTATION_TYPE, , })
@Retention()
@Documented
public @interface Condition {

    /**
     * 默认为 等于
     *
     * @return 等于
     */
    ConditionEnum conditionEnum() default ;

    /**
     * 数据类型 默认 字符串
     *
     * @return 字符串
     */
    DataTypeEnum dataTypeEnum() default ;

    /**
     * 格式
     *
     * @return 格式
     */
    String format() default "";
}

7、


public enum ConditionEnum {

    /**
     * 等于
     */
    Equals("Equals", "等于"),

    /**
     * 等于
     */
    Like("Like", "等于"),

    /**
     * 大于
     */
    GreaterThan("GreaterThan", "大于"),

    /**
     * 大于等于
     */
    GreaterThanOrEqualTo("GreaterThanOrEqualTo", "大于等于"),

    /**
     * 小于
     */
    LessThan("LessThan", "小于"),

    /**
     * 小于等于
     */
    LessThanOrEqualTo("LessThanOrEqualTo", "小于等于"),

    /**
     * 不为空
     */
    IsNotNull("IsNotNull", "不为空"),

    /**
     * 为空
     */
    IsNull("IsNull", "为空");

    /**
     * 构造函数
     *
     * @param key   键
     * @param value 值
     */
    ConditionEnum(final String key, final String value) {
         = key;
         = value;
    }

    /**
     * 键
     */
    private final String key;

    /**
     * 值
     */
    private final String value;

    /**
     * 获取 健
     *
     * @return 健
     */
    public String getKey() {
        return ;
    }

    /**
     * 获取 值
     *
     * @return 值
     */
    public String getValue() {
        return ;
    }
}

8、


public enum DataTypeEnum {

    /**
     * Integer
     */
    INTEGER(, "Integer"),

    /**
     * Date
     */
    DATE(, "Date"),

    /**
     * Double
     */
    DOUBLE(, "Double"),

    /**
     * Float
     */
    FLOAT(, "Float"),

    /**
     * BigDecimal
     */
    BIGDECIMAL(, "BigDecimal"),

    /**
     * String
     */
    STRING(, "String"),

    /**
     * Long
     */
    LONG(, "Long");

    /**
     * 构造函数
     *
     * @param key   键
     * @param value 值
     */
    DataTypeEnum(final Class key, final String value) {
         = key;
         = value;
    }

    /**
     * 键
     */
    private final Class key;

    /**
     * 值
     */
    private final String value;

    /**
     * 获取 健
     *
     * @return 健
     */
    public Class getKey() {
        return ;
    }

    /**
     * 获取 值
     *
     * @return 值
     */
    public String getValue() {
        return ;
    }
}