Skip to content

Instantly share code, notes, and snippets.

@andrewlalis
Created May 31, 2021 08:06
Show Gist options
  • Save andrewlalis/0c372ea5ebc4c0111407dd8c8d9c990d to your computer and use it in GitHub Desktop.
Save andrewlalis/0c372ea5ebc4c0111407dd8c8d9c990d to your computer and use it in GitHub Desktop.
Simple builder pattern for JPA predicates.
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