PowerJob的QueryConvertUtils工作流程源码解读

 更新时间:2024年01月18日 10:40:02   作者:codecraft  
这篇文章主要为大家介绍了PowerJob的QueryConvertUtils工作流程源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

本文主要研究一下PowerJob的QueryConvertUtils

QueryConvertUtils

tech/powerjob/server/persistence/QueryConvertUtils.java

public class QueryConvertUtils {
    public static <T> Specification<T> toSpecification(PowerQuery powerQuery) {
        return (Specification<T>) (root, query, cb) -> {
            List<Predicate> predicates = Lists.newLinkedList();
            Field[] fields = powerQuery.getClass().getDeclaredFields();
            try {
                for (Field field : fields) {
                    field.setAccessible(true);
                    String fieldName = field.getName();
                    Object fieldValue = field.get(powerQuery);
                    if (fieldValue == null) {
                        continue;
                    }
                    if (fieldName.endsWith(PowerQuery.EQUAL)) {
                        String colName = StringUtils.substringBeforeLast(fieldName, PowerQuery.EQUAL);
                        predicates.add(cb.equal(root.get(colName), fieldValue));
                    } else if (fieldName.endsWith(PowerQuery.NOT_EQUAL)) {
                        String colName = StringUtils.substringBeforeLast(fieldName, PowerQuery.NOT_EQUAL);
                        predicates.add(cb.notEqual(root.get(colName), fieldValue));
                    } else if (fieldName.endsWith(PowerQuery.LIKE)) {
                        String colName = StringUtils.substringBeforeLast(fieldName, PowerQuery.LIKE);
                        predicates.add(cb.like(root.get(colName), convertLikeParams(fieldValue)));
                    } else if (fieldName.endsWith(PowerQuery.NOT_LIKE)) {
                        String colName = StringUtils.substringBeforeLast(fieldName, PowerQuery.NOT_LIKE);
                        predicates.add(cb.notLike(root.get(colName), convertLikeParams(fieldValue)));
                    } else if (fieldName.endsWith(PowerQuery.LESS_THAN)) {
                        String colName = StringUtils.substringBeforeLast(fieldName, PowerQuery.LESS_THAN);
                        predicates.add(cb.lessThan(root.get(colName), (Comparable)fieldValue));
                    } else if (fieldName.endsWith(PowerQuery.GREATER_THAN)) {
                        String colName = StringUtils.substringBeforeLast(fieldName, PowerQuery.GREATER_THAN);
                        predicates.add(cb.greaterThan(root.get(colName), (Comparable)fieldValue));
                    } else if (fieldName.endsWith(PowerQuery.LESS_THAN_EQUAL)) {
                        String colName = StringUtils.substringBeforeLast(fieldName, PowerQuery.LESS_THAN_EQUAL);
                        predicates.add(cb.lessThanOrEqualTo(root.get(colName), (Comparable)fieldValue));
                    } else if (fieldName.endsWith(PowerQuery.GREATER_THAN_EQUAL)) {
                        String colName = StringUtils.substringBeforeLast(fieldName, PowerQuery.GREATER_THAN_EQUAL);
                        predicates.add(cb.greaterThanOrEqualTo(root.get(colName), (Comparable)fieldValue));
                    } else if (fieldName.endsWith(PowerQuery.IN)) {
                        String colName = StringUtils.substringBeforeLast(fieldName, PowerQuery.IN);
                        predicates.add(root.get(colName).in(convertInParams(fieldValue)));
                    } else if (fieldName.endsWith(PowerQuery.NOT_IN)) {
                        String colName = StringUtils.substringBeforeLast(fieldName, PowerQuery.NOT_IN);
                        predicates.add(cb.not(root.get(colName).in(convertInParams(fieldValue))));
                    } else if (fieldName.endsWith(PowerQuery.IS_NULL)) {
                        String colName = StringUtils.substringBeforeLast(fieldName, PowerQuery.IS_NULL);
                        predicates.add(cb.isNull(root.get(colName)));
                    } else if (fieldName.endsWith(PowerQuery.IS_NOT_NULL)) {
                        String colName = StringUtils.substringBeforeLast(fieldName, PowerQuery.IS_NOT_NULL);
                        predicates.add(cb.isNotNull(root.get(colName)));
                    }
                }
            } catch (Exception e) {
                log.warn("[QueryConvertUtils] convert failed for query: {}", query, e);
                throw new PowerJobException("convert query object failed, maybe you should redesign your query object!");
            }
            if (powerQuery.getAppIdEq() != null) {
                predicates.add(cb.equal(root.get("appId"), powerQuery.getAppIdEq()));
            }
            return query.where(predicates.toArray(new Predicate[0])).getRestriction();
        };
    }
    private static String convertLikeParams(Object o) {
        String s = (String) o;
        if (!s.startsWith("%")) {
            s = "%" + s;
        }
        if (!s.endsWith("%")) {
            s = s + "%";
        }
        return s;
    }
    private static Object[] convertInParams(Object o) {
        // FastJSON, 永远滴神!
        return JSONArray.parseArray(JSONArray.toJSONString(o)).toArray();
    }
}
QueryConvertUtils提供了toSpecification静态方法,用于将PowerQuery转换为jpa的Specification

PowerQuery

public abstract class PowerQuery {
    public static String EQUAL = "Eq";
    public static String NOT_EQUAL = "NotEq";
    public static String LIKE = "Like";
    public static String NOT_LIKE = "NotLike";
    public static String LESS_THAN = "Lt";
    public static String LESS_THAN_EQUAL = "LtEq";
    public static String GREATER_THAN = "Gt";
    public static String GREATER_THAN_EQUAL = "GtEq";
    public static String IN = "In";
    public static String NOT_IN = "NotIn";
    public static String IS_NULL = "IsNull";
    public static String IS_NOT_NULL = "IsNotNull";
    private Long appIdEq;
}
PowerQuery是个抽象类,定义了一系列操作符

JobInfoQuery

tech/powerjob/common/request/query/JobInfoQuery.java

@Getter
@Setter
@Accessors(chain = true)
public class JobInfoQuery extends PowerQuery {
    private Long idEq;
    private Long idLt;
    private Long idGt;
    private String jobNameEq;
    private String jobNameLike;
    private String jobDescriptionLike;
    private String jobParamsLike;
    private List<Integer> timeExpressionTypeIn;
    private List<Integer> executeTypeIn;
    private List<Integer> processorTypeIn;
    private String processorInfoEq;
    private String processorInfoLike;
    private List<Integer> statusIn;
    private Long nextTriggerTimeGt;
    private Long nextTriggerTimeLt;
    private String notifyUserIdsLike;
    private Date gmtCreateLt;
    private Date gmtCreateGt;
    private Date gmtModifiedLt;
    private Date gmtModifiedGt;
    private Integer dispatchStrategyEq;
    private String tagEq;
}
JobInfoQuery继承了PowerQuery,它根据要查询的字段及操作定义了诸如idEq,idLt,idGt的属性

InstanceService

tech/powerjob/server/core/instance/InstanceService.java

public List<InstanceInfoDTO> queryInstanceInfo(PowerQuery powerQuery) {
        return instanceInfoRepository
                .findAll(QueryConvertUtils.toSpecification(powerQuery))
                .stream()
                .map(InstanceService::directConvert)
                .collect(Collectors.toList());
    }
InstanceService的queryInstanceInfo方法使用QueryConvertUtils.toSpecification(powerQuery)将powerQuery转换为Specification,再利用JpaSpecificationExecutor的findAll(Specification)进行查询

小结

QueryConvertUtils提供了toSpecification静态方法,用于将PowerQuery转换为jpa的Specification,其约定query的属性以字段名+操作符构成,toSpecification根据这个规则来解析并转换为Specification,之后就可以利用jpa进行查询。

以上就是PowerJob的QueryConvertUtils工作流程源码解读的详细内容,更多关于PowerJob QueryConvertUtils的资料请关注脚本之家其它相关文章!

相关文章

  • 解决IDEA无法读取maven镜像,jar包下载失败的问题

    解决IDEA无法读取maven镜像,jar包下载失败的问题

    这篇文章主要介绍了解决IDEA无法读取maven镜像,jar包下载失败的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Java中Elasticsearch的4种分页方式详解

    Java中Elasticsearch的4种分页方式详解

    在 Elasticsearch 中,有 4种常见的分页方法,本文将带大家分析一下每种方法的优缺点以及我们该如何选择,感兴趣的小伙伴可以参考一下
    2025-01-01
  • Spring Boot Logback配置日志过程解析

    Spring Boot Logback配置日志过程解析

    这篇文章主要介绍了Spring Boot Logback配置日志过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • JMeter参数化4种实现方式(小结)

    JMeter参数化4种实现方式(小结)

    参数化是自动化测试脚本的一种常用技巧,可将脚本中的某些输入使用参数来代替,JMeter提供了多种参数化方式,下面就其中常用的4种展开阐述,感兴趣的可以来了解一下
    2021-12-12
  • Lambda表达式的使用及注意事项

    Lambda表达式的使用及注意事项

    这篇文章主要介绍了Lambda表达式的使用及注意事项,主要围绕 Lambda表达式的省略模式 Lambda表达式和匿名内部类的区别的相关内容展开详情,感兴趣的小伙伴可以参考一下
    2022-06-06
  • Java 中 synchronized的用法详解(四种用法)

    Java 中 synchronized的用法详解(四种用法)

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。本文给大家介绍java中 synchronized的用法,对本文感兴趣的朋友一起看看吧
    2015-11-11
  • 浅谈异常结构图、编译期异常和运行期异常的区别

    浅谈异常结构图、编译期异常和运行期异常的区别

    下面小编就为大家带来一篇浅谈异常结构图、编译期异常和运行期异常的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • spring boot 日志配置详解

    spring boot 日志配置详解

    本篇文章主要介绍了spring boot 日志配置 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • 如何使用java写Student类的功能

    如何使用java写Student类的功能

    这篇文章主要介绍了如何使用java写Student类的功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 基于Java实现动态切换ubuntu壁纸功能

    基于Java实现动态切换ubuntu壁纸功能

    这篇文章主要为大家详细介绍了如何使用 Java 在 Ubuntu Linux 系统中实现自动切换壁纸的示例程序,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-11-11

最新评论