public abstract class AbstractJpaService<AU extends Entity, C extends GenericCriteria, R extends Repository> {
protected final R repository;
@Autowired
public AbstractJpaService(R repository) {
this.repository = repository;
}
public Page<AU> findAll(C criteria) {
if (repository instanceof JpaSpecificationExecutor) {
return ((JpaSpecificationExecutor<AU>) repository).findAll((Specification<AU>) (root, query, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
processCriteriaSpecifications(root, criteriaBuilder, predicates, criteria);
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
}, paging(criteria));
}
return null;
}
private Pageable paging(C criteria) {
Pageable paging = Pageable.unpaged();
if (!((criteria.getPage() == null || criteria.getPerPage() == null) || (criteria.getPage() < 0 || criteria.getPerPage() <= 0))) {
if (!utils.isEmpty(criteria.getSortBy())) {
paging = PageRequest.of(criteria.getPage(), criteria.getPerPage(), Sort.by(criteria.getDirection(), criteria.getSortBy()));
} else {
paging = PageRequest.of(criteria.getPage(), criteria.getPerPage());
}
}
return paging;
}
protected void processCriteriaSpecifications(Root<AU> root, CriteriaBuilder cb, List<Predicate> predicates, C criteria) {
}
}