Created
May 31, 2021 08:06
-
-
Save andrewlalis/0c372ea5ebc4c0111407dd8c8d9c990d to your computer and use it in GitHub Desktop.
Simple builder pattern for JPA predicates.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.company.util; | |
import javax.persistence.criteria.CriteriaBuilder; | |
import javax.persistence.criteria.Path; | |
import javax.persistence.criteria.Predicate; | |
import java.util.ArrayList; | |
import java.util.List; | |
/** | |
* This builder can be used to build either a conjunction or disjunction | |
* predicate, where the final predicate is composed of a number of other | |
* provided predicates. | |
*/ | |
public class PredicateBuilder { | |
private enum Type {AND, OR} | |
private final List<Predicate> predicates; | |
private final Type type; | |
private final CriteriaBuilder criteriaBuilder; | |
private PredicateBuilder(CriteriaBuilder criteriaBuilder, Type type) { | |
this.predicates = new ArrayList<>(); | |
this.criteriaBuilder = criteriaBuilder; | |
this.type = type; | |
} | |
public static PredicateBuilder conjunction(CriteriaBuilder criteriaBuilder) { | |
return new PredicateBuilder(criteriaBuilder, Type.AND); | |
} | |
public static PredicateBuilder disjunction(CriteriaBuilder criteriaBuilder) { | |
return new PredicateBuilder(criteriaBuilder, Type.OR); | |
} | |
public PredicateBuilder with(Predicate predicate) { | |
this.predicates.add(predicate); | |
return this; | |
} | |
public PredicateBuilder withLikeLowerSubstring(String s, Path<String> attributePath) { | |
return this.with(this.criteriaBuilder.like(this.criteriaBuilder.lower(attributePath), "%" + s.trim().toLowerCase() + "%")); | |
} | |
public Predicate build() { | |
Predicate[] array = this.predicates.toArray(new Predicate[0]); | |
if (this.type == Type.AND) { | |
return this.criteriaBuilder.and(array); | |
} else { | |
return this.criteriaBuilder.or(array); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment