Как устранить дублирование в коде с помощью Spring Specification? - PullRequest
0 голосов
/ 13 июня 2019

Мне нужно создать спецификацию Spring для поиска по нескольким полям, используя условия ANR и OR.Но также мне нужно заказать запрос по другому полю DESC.Создавая такое выражение, я использую ORDER BY в каждом подвыражении.Как это возможно для устранения дублирования?

query.orderBy(cb.desc(root.get(ExternalPatientEntity_.dateCreated)));

            return cb.and(predicates.build().toArray(new Predicate[0])); 

в одном выражении, но мне нужно объединить AND и OR, так что это бесполезно.

    private static Specification<PatientEntity> getPatientById(PatientsSearchParameters searchParameters) {
        return (root, query, cb) -> {
            Predicate predicate = null;
            if (searchParameters.getId() != null) {
                predicate = cb.equal(root.get(PatientEntity_.clinId), searchParameters.getId());
            }
            query.orderBy(cb.desc(root.get(PatientEntity_.dateCreated)));
            return predicate;
        };
    }

    private static Specification<PatientEntity> getPatientByAnotherId(PatientsSearchParameters searchParameters) {
        return (root, query, cb) -> {
            Predicate predicate = null;
            if (searchParameters.getAnotherId() != null) {
                predicate = cb.equal(root.get(PatientEntity_.clinId), searchParameters.getAnotherId());
            }
            query.orderBy(cb.desc(root.get(PatientEntity_.dateCreated)));
            return predicate;
        };
    }

    private static Specification<PatientEntity> getPatientByIsAdmin(PatientsSearchParameters searchParameters) {
        return (root, query, cb) -> {
            Predicate predicate = null;
            if (searchParameters.getIdsId() != null) {
                predicate = cb.isNull(root.get(PatientEntity_.dateArchived));
            }
            query.orderBy(cb.desc(root.get(PatientEntity_.dateCreated)));
            return predicate;
        };
    }

    public static Specification<PatientEntity> search(PatientsSearchParameters searchParameters) {
        return Specifications.where(getPatientById(searchParameters))
                .and(getPatientByAnotherId(searchParameters))
                .or(getPatientByIsAdmin(searchParameters));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...