<aside>
💡 组合条件查询是一般应用都有的需求,但是jpa用@Query总是存在一些问题,所以使用自定义Specification 来进行
</aside>
package org.apache.griffin.core.job;
import com.ewell.common.util.DateUtil;
import lombok.Builder;
import lombok.Data;
import lombok.experimental.Tolerate;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.griffin.core.job.entity.JobInstanceBean;
import org.apache.griffin.core.job.entity.LivySessionStates;
import org.springframework.data.jpa.domain.Specification;
import javax.persistence.criteria.*;
import java.util.ArrayList;
import java.util.List;
/**
* @author huajiejun
* @date 2020/12/17 5:31 下午
*/
@Builder
@Data
public class JobInstanceCondition implements Specification<JobInstanceBean> {
private Long startTime;
private Long endTime;
private List<Long> ids;
private Integer mark;
private LivySessionStates.State state;
@Override
public Predicate toPredicate(Root<JobInstanceBean> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
List<Predicate> predicateList = new ArrayList<>();
Path<Long> tmsField = root.get("tms");
Path<String> stateField = root.get("state");
Path<Long> jobField = root.get("job");
if (CollectionUtils.isNotEmpty(ids)) {
predicateList.add(jobField.as(Long.class).in(ids));
}
if (state != null) {
predicateList.add(criteriaBuilder.equal(stateField, state));
}
if (mark != null && mark == 1) {
predicateList.add(criteriaBuilder.greaterThanOrEqualTo(tmsField, DateUtil.getStartTimeOfCurrentDate().getTime()));
}
if (startTime != null) {
predicateList.add(criteriaBuilder.greaterThanOrEqualTo(tmsField, startTime));
}
if (endTime != null) {
predicateList.add(criteriaBuilder.lessThanOrEqualTo(tmsField, endTime));
}
Predicate[] pre = new Predicate[predicateList.size()];
pre = predicateList.toArray(pre);
return criteriaQuery.where(pre).getRestriction();
}
@Tolerate
public JobInstanceCondition() {
}
}
list = instanceRepo.findAll(
[JobInstanceCondition](<https://www.notion.so/c2914355a19447aebf59d9fa646732aa>).builder()
.ids(listLong)
.dqJobIds(listLongForType)
.mark(mark)
.startTime(startTime)
.endTime(endTime)
.state(state)
.build()
, pageable);