欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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靜態(tài)方法,用于將PowerQuery轉(zhuǎn)換為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,它根據(jù)要查詢的字段及操作定義了諸如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轉(zhuǎn)換為Specification,再利用JpaSpecificationExecutor的findAll(Specification)進行查詢

小結(jié)

QueryConvertUtils提供了toSpecification靜態(tài)方法,用于將PowerQuery轉(zhuǎn)換為jpa的Specification,其約定query的屬性以字段名+操作符構(gòu)成,toSpecification根據(jù)這個規(guī)則來解析并轉(zhuǎn)換為Specification,之后就可以利用jpa進行查詢。

以上就是PowerJob的QueryConvertUtils工作流程源碼解讀的詳細內(nèi)容,更多關(guān)于PowerJob QueryConvertUtils的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • IDEA下Maven的pom文件導(dǎo)入依賴出現(xiàn)Auto build completed with errors的問題

    IDEA下Maven的pom文件導(dǎo)入依賴出現(xiàn)Auto build completed with errors的問題

    這篇文章主要介紹了IDEA下Maven的pom文件導(dǎo)入依賴出現(xiàn)Auto build completed with errors,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • SpringBoot整合Spring?Boot?Admin實現(xiàn)服務(wù)監(jiān)控的方法

    SpringBoot整合Spring?Boot?Admin實現(xiàn)服務(wù)監(jiān)控的方法

    這篇文章主要介紹了SpringBoot整合Spring?Boot?Admin實現(xiàn)服務(wù)監(jiān)控,內(nèi)容包括Server端服務(wù)開發(fā),Client端服務(wù)開發(fā)其中Spring Boot Admin還可以對其監(jiān)控的服務(wù)提供告警功能,如服務(wù)宕機時,可以及時以郵件方式通知運維人員,感興趣的朋友跟隨小編一起看看吧
    2022-03-03
  • Java 泛型實例詳解

    Java 泛型實例詳解

    本文主要介紹Java 泛型的知識,這里給代碼實例對Java 泛型深度理解,有需要的朋友可以看下
    2016-07-07
  • MyBatis的核心配置文件以及映射文件

    MyBatis的核心配置文件以及映射文件

    這篇文章主要介紹了MyBatis的核心配置文件以及映射文件,Mybatis它是一款半自動的ORM持久層框架,具有較高的SQL靈活性,支持高級映射(一對一,一對多),動態(tài)SQL,延遲加載和緩存等特性,但它的數(shù)據(jù)庫無關(guān)性較低,需要的朋友可以參考下
    2023-05-05
  • 如何讓java只根據(jù)數(shù)據(jù)庫表名自動生成實體類

    如何讓java只根據(jù)數(shù)據(jù)庫表名自動生成實體類

    今天給大家?guī)淼闹R是關(guān)于Java的,文章圍繞著如何讓java只根據(jù)數(shù)據(jù)庫表名自動生成實體類展開,文中有非常詳細的介紹,需要的朋友可以參考下
    2021-06-06
  • Java8中Optional的一些常見錯誤用法總結(jié)

    Java8中Optional的一些常見錯誤用法總結(jié)

    我們知道 Java 8 增加了一些很有用的 API, 其中一個就是 Optional,下面這篇文章主要給大家介紹了關(guān)于Java8中Optional的一些常見錯誤用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-07-07
  • MyBatis-Plus 之selectMaps、selectObjs、selectCount、selectOne的使用

    MyBatis-Plus 之selectMaps、selectObjs、selectCount、selectO

    本文主要介紹了MyBatis-Plus 之selectMaps、selectObjs、selectCount、selectOne的使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • java使用des加密解密示例分享

    java使用des加密解密示例分享

    java使用des加密解密示例,適合java語言的所有平臺,與.net等平臺的加密解密兼容
    2014-02-02
  • IDEA 啟動 Tomcat 項目輸出亂碼的解決方法

    IDEA 啟動 Tomcat 項目輸出亂碼的解決方法

    這篇文章主要介紹了IDEA 啟動 Tomcat 項目輸出亂碼的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 詳解Java Web如何限制訪問的IP的兩種方法

    詳解Java Web如何限制訪問的IP的兩種方法

    這篇文章主要介紹了詳解Java Web如何限制訪問的IP的兩種方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10

最新評論