Загрузка данных


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]));
        };
    }