All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.wenhao.jpa.PredicateBuilder Maven / Gradle / Ivy

The newest version!
package com.github.wenhao.jpa;

import com.github.wenhao.jpa.specification.BetweenSpecification;
import com.github.wenhao.jpa.specification.EqualSpecification;
import com.github.wenhao.jpa.specification.GeSpecification;
import com.github.wenhao.jpa.specification.GtSpecification;
import com.github.wenhao.jpa.specification.InSpecification;
import com.github.wenhao.jpa.specification.LeSpecification;
import com.github.wenhao.jpa.specification.LikeSpecification;
import com.github.wenhao.jpa.specification.LtSpecification;
import com.github.wenhao.jpa.specification.NotEqualSpecification;
import com.github.wenhao.jpa.specification.NotInSpecification;
import com.github.wenhao.jpa.specification.NotLikeSpecification;
import org.springframework.data.jpa.domain.Specification;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import static javax.persistence.criteria.Predicate.BooleanOperator.OR;

public class PredicateBuilder {

    private final Predicate.BooleanOperator operator;

    private List> specifications;

    public PredicateBuilder(Predicate.BooleanOperator operator) {
        this.operator = operator;
        this.specifications = new ArrayList<>();
    }

    public PredicateBuilder eq(String property, Object... values) {
        return eq(true, property, values);
    }

    public PredicateBuilder eq(boolean condition, String property, Object... values) {
        return this.predicate(condition, new EqualSpecification(property, values));
    }

    public PredicateBuilder ne(String property, Object... values) {
        return ne(true, property, values);
    }

    public PredicateBuilder ne(boolean condition, String property, Object... values) {
        return this.predicate(condition, new NotEqualSpecification(property, values));
    }

    public PredicateBuilder gt(String property, Comparable compare) {
        return gt(true, property, compare);
    }

    public PredicateBuilder gt(boolean condition, String property, Comparable compare) {
        return this.predicate(condition, new GtSpecification(property, compare));
    }

    public PredicateBuilder ge(String property, Comparable compare) {
        return ge(true, property, compare);
    }

    public PredicateBuilder ge(boolean condition, String property, Comparable compare) {
        return this.predicate(condition, new GeSpecification(property, compare));
    }

    public PredicateBuilder lt(String property, Comparable number) {
        return lt(true, property, number);
    }

    public PredicateBuilder lt(boolean condition, String property, Comparable compare) {
        return this.predicate(condition, new LtSpecification(property, compare));
    }

    public PredicateBuilder le(String property, Comparable compare) {
        return le(true, property, compare);
    }

    public PredicateBuilder le(boolean condition, String property, Comparable compare) {
        return this.predicate(condition, new LeSpecification(property, compare));
    }

    public PredicateBuilder between(String property, Object lower, Object upper) {
        return between(true, property, lower, upper);
    }

    public PredicateBuilder between(boolean condition, String property, Object lower, Object upper) {
        return this.predicate(condition, new BetweenSpecification(property, lower, upper));
    }

    public PredicateBuilder like(String property, String... patterns) {
        return like(true, property, patterns);
    }

    public PredicateBuilder like(boolean condition, String property, String... patterns) {
        return this.predicate(condition, new LikeSpecification(property, patterns));
    }

    public PredicateBuilder notLike(String property, String... patterns) {
        return notLike(true, property, patterns);
    }

    public PredicateBuilder notLike(boolean condition, String property, String... patterns) {
        return this.predicate(condition, new NotLikeSpecification(property, patterns));
    }

    public PredicateBuilder in(String property, Object... values) {
        return this.in(true, property, values);
    }

    public PredicateBuilder in(boolean condition, String property, Object... values) {
        return this.predicate(condition, new InSpecification(property, values));
    }

    public PredicateBuilder notIn(String property, Object... values) {
        return this.notIn(true, property, values);
    }

    public PredicateBuilder notIn(boolean condition, String property, Object... values) {
        return this.predicate(condition, new NotInSpecification(property, values));
    }

    public PredicateBuilder predicate(Specification specification) {
        return predicate(true, specification);
    }

    public PredicateBuilder predicate(boolean condition, Specification specification) {
        if (condition) {
            this.specifications.add(specification);
        }
        return this;
    }

    public Specification build() {
        return (Root root, CriteriaQuery query, CriteriaBuilder cb) -> {
            Predicate[] predicates = new Predicate[specifications.size()];
            for (int i = 0; i < specifications.size(); i++) {
                predicates[i] = specifications.get(i).toPredicate(root, query, cb);
            }
            if (Objects.equals(predicates.length, 0)) {
                return null;
            }
            return OR.equals(operator) ? cb.or(predicates) : cb.and(predicates);
        };
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy