<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);