default List<Order> findAllByPredicate(
Status status,
String clientName,
String clientEmail,
BigDecimal minAmount,
BigDecimal maxAmount,
LocalDateTime dateFrom,
LocalDateTime dateTo,
Sort sort
) {
return this.findAll(buildSearchSpecification(status,
clientName,
clientEmail,
minAmount,
maxAmount,
dateFrom,
dateTo),
sort);
}
private Specification<Order> buildSearchSpecification(
Status status,
String clientName,
String clientEmail,
BigDecimal minAmount,
BigDecimal maxAmount,
LocalDateTime dateFrom,
LocalDateTime dateTo
) {
return (root, query, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
Join<Order, Client> client = root.join("client");
if (status != null) {
predicates.add(criteriaBuilder.equal(root.get("status"), status));
}
if (clientName != null) {
predicates.add(criteriaBuilder.like(
criteriaBuilder.lower(client.get("name")),
"%" + clientName.toLowerCase(Locale.ROOT) + "%"
));
}
if (clientEmail != null) {
predicates.add(criteriaBuilder.equal(
criteriaBuilder.lower(client.get("email")),
clientEmail.toLowerCase(Locale.ROOT)
));
}
if (minAmount != null) {
predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get("amount"), minAmount));
}
if (maxAmount != null) {
predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get("amount"), maxAmount));
}
if (dateFrom != null) {
predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get("createdDate"), dateFrom));
}
if (dateTo != null) {
predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get("createdDate"), dateTo));
}
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
};
}