com.github.mikesafonov.specification.builder.starter.predicates.ManyToManyCollectionPredicateBuilder Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of spring-boot-starter-specification-builder Show documentation
Show all versions of spring-boot-starter-specification-builder Show documentation
Spring Boot starter for building specifications in declarative way
package com.github.mikesafonov.specification.builder.starter.predicates;
import com.github.mikesafonov.specification.builder.starter.ExpressionBuilder;
import com.github.mikesafonov.specification.builder.starter.FieldWithValue;
import lombok.RequiredArgsConstructor;
import javax.persistence.criteria.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* The predicate is constructed according to the following scheme:
* for each element of the collection a subquery is created that checks the existence of an
* entry in the intersection table for the link between the related and target table.
*
* @param
* @author MikeSafonov
*/
@RequiredArgsConstructor
public class ManyToManyCollectionPredicateBuilder implements PredicateBuilder {
private final Root root;
private final CriteriaBuilder cb;
private final CriteriaQuery> cq;
private final FieldWithValue field;
private final ExpressionBuilder expressionBuilder;
@Override
public Predicate build() {
Collection collection = field.getValueAsCollection();
List predicates = new ArrayList<>();
for (Object filter : collection) {
Subquery sq = cq.subquery((Class) root.getJavaType());
Root project = sq.from((Class) root.getJavaType());
Expression expr = expressionBuilder.getExpressionForSubquery(project, field, cb.equal(project, root));
sq.select(project).where(cb.equal(expr, filter));
predicates.add(cb.exists(sq));
}
return cb.and(predicates.toArray(new Predicate[0]));
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy