Мне нужно создать спецификацию 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));
}