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,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06SpringBoot整合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只根據(jù)數(shù)據(jù)庫表名自動生成實體類
今天給大家?guī)淼闹R是關(guān)于Java的,文章圍繞著如何讓java只根據(jù)數(shù)據(jù)庫表名自動生成實體類展開,文中有非常詳細的介紹,需要的朋友可以參考下2021-06-06Java8中Optional的一些常見錯誤用法總結(jié)
我們知道 Java 8 增加了一些很有用的 API, 其中一個就是 Optional,下面這篇文章主要給大家介紹了關(guān)于Java8中Optional的一些常見錯誤用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2018-07-07MyBatis-Plus 之selectMaps、selectObjs、selectCount、selectO
本文主要介紹了MyBatis-Plus 之selectMaps、selectObjs、selectCount、selectOne的使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03