Два HTTP-запроса на получение одного и того же действия, приводящие к исключению SocketTimeOutException

Вы можете использовать Спецификации, которые Spring-data дает вам из коробки. и иметь возможность использовать критерии API для создания запросов программным способом. Для поддержки спецификаций вы можете расширить свой интерфейс репозитория с помощью интерфейса JpaSpecificationExecutor

public interface CustomerRepository extends SimpleJpaRepository, JpaSpecificationExecutor {

}

. Дополнительный интерфейс (JpaSpecificationExecutor) содержит методы, которые позволяют выполнять спецификации в различными способами.

Например, метод findAll возвращает все сущности, соответствующие спецификации:

List findAll(Specification spec);

Интерфейс спецификации выглядит следующим образом:

public interface Specification {
     Predicate toPredicate(Root root, CriteriaQuery query,
            CriteriaBuilder builder);
}

Хорошо, так какой типичный вариант использования? Спецификации могут быть легко использованы для создания расширяемого набора предикатов на вершине объекта, который затем может быть объединен и использован с JpaRepository без необходимости объявлять запрос (метод) для каждой необходимой комбинации. Вот пример: Пример 2.15. Спецификации для клиента

public class CustomerSpecs {
    public static Specification isLongTermCustomer() {
        return new Specification() {
            public Predicate toPredicate(
                Root root, CriteriaQuery query,
                CriteriaBuilder builder) {
                LocalDate date = new LocalDate().minusYears(2);
                return builder.lessThan(root.get('dateField'), date);
            }
        };
    }

    public static Specification hasSalesOfMoreThan(MontaryAmount value) {
        return new Specification() {
            public Predicate toPredicate(
                Root root, CriteriaQuery query,
                CriteriaBuilder builder) {
                // build query here
            }
        };
    }
}

Вы указали некоторые критерии уровня абстракции бизнес-требований и создали исполняемые спецификации. Таким образом, клиент может использовать Спецификацию следующим образом:

List customers = customerRepository.findAll(isLongTermCustomer());

Вы также можете комбинировать пример спецификации 2.17. Комбинированные спецификации

    MonetaryAmount amount = new MonetaryAmount(200.0, Currencies.DOLLAR);
    List customers = customerRepository.findAll(
        where(isLongTermCustomer()).or(hasSalesOfMoreThan(amount)));

Как вы можете видеть, спецификации предлагают некоторые методы клея-кода для объединения и комбинирования спецификаций. Таким образом, расширение уровня доступа к данным - это просто вопрос о создании новых спецификаций спецификаций и их объединении с уже существующими.

blockquote>

И вы можете создавать сложные спецификации, вот пример

public class WorkInProgressSpecification {
    public static Specification findByCriteria(final SearchCriteria searchCriteria) {

        return new Specification() {

            @Override
            public Predicate toPredicate(
                Root root,
                CriteriaQuery query, CriteriaBuilder cb) {

                List predicates = new ArrayList();

                if (searchCriteria.getView() != null && !searchCriteria.getView().isEmpty()) {
                    predicates.add(cb.equal(root.get("viewType"), searchCriteria.getView()));
                }
                if (searchCriteria.getFeature() != null && !searchCriteria.getFeature().isEmpty()) {
                    predicates.add(cb.equal(root.get("title"), searchCriteria.getFeature()));
                }
                if (searchCriteria.getEpic() != null && !searchCriteria.getEpic().isEmpty()) {
                    predicates.add(cb.equal(root.get("epic"), searchCriteria.getEpic()));
                }
                if (searchCriteria.getPerformingGroup() != null && !searchCriteria.getPerformingGroup().isEmpty()) {
                    predicates.add(cb.equal(root.get("performingGroup"), searchCriteria.getPerformingGroup()));
                }
                if (searchCriteria.getPlannedStartDate() != null) {
                    System.out.println("searchCriteria.getPlannedStartDate():" + searchCriteria.getPlannedStartDate());
                    predicates.add(cb.greaterThanOrEqualTo(root.get("plndStartDate"), searchCriteria.getPlannedStartDate()));
                }
                if (searchCriteria.getPlannedCompletionDate() != null) {
                    predicates.add(cb.lessThanOrEqualTo(root.get("plndComplDate"), searchCriteria.getPlannedCompletionDate()));
                }
                if (searchCriteria.getTeam() != null && !searchCriteria.getTeam().isEmpty()) {
                    predicates.add(cb.equal(root.get("agileTeam"), searchCriteria.getTeam()));
                }

                return cb.and(predicates.toArray(new Predicate[] {}));
            }
        };
    }
}

Здесь JPA Respositories docs

0
задан shkschneider 16 January 2019 в 10:35
поделиться