Привет. Я пытаюсь получить все записи в конкретном документе / объекте при весенней загрузке на основе QueryDSLPredicate.Ответ должен быть доступным для просмотра.Я пытаюсь сделать что-то вроде этого.
Page<ViolationMinInfo> findAllProjectedBy(Predicate predicate, Pageable pageable);
, где ViolationMinInfo - это проекция моей сущности Violation.У меня есть сценарий использования, который требует от меня использовать этот метод тоже.
Page<Violation> findAll(Predicate predicate, Pageable pageable);
Однако, когда я использую первый метод Spring data, Mongo игнорирует предикат и просто предоставляет мне проекцию в виде страниц.Есть ли способ поддержать всех троих?Ниже мой репозиторий.
public interface ViolationRepository extends MongoRepository<Violation, String>, QuerydslPredicateExecutor<Violation>, QuerydslBinderCustomizer<QViolation> {
Violation findBy_id(String id);
Violation findTopByViolatorNtidOrderByAlertDateDesc(String ntid);
Page<ViolationMinInfo> findAllProjectedBy(Predicate predicate, Pageable pageable);
@Override
default void customize(final QuerydslBindings bindings, final QViolation root) {
bindings.bind(root.severity).all((StringPath path, Collection<? extends String> values) -> {
BooleanBuilder predicate = new BooleanBuilder();
// oneliner with Java 8 forEach
values.forEach( value -> predicate.or(path.containsIgnoreCase(value)));
return Optional.of(predicate);
});
bindings.bind(root.useCase).all((StringPath path, Collection<? extends String> values) -> {
BooleanBuilder predicate = new BooleanBuilder();
// oneliner with Java 8 forEach
values.forEach( value -> predicate.or(path.equalsIgnoreCase(value)));
return Optional.of(predicate);
});
bindings.bind(root.violatorNtid).all((StringPath path, Collection<? extends String> values) -> {
BooleanBuilder predicate = new BooleanBuilder();
// oneliner with Java 8 forEach
values.forEach( value -> predicate.or(path.equalsIgnoreCase(value)));
return Optional.of(predicate);
});
bindings.bind(String.class).all((StringPath path, Collection<? extends String> values) -> {
BooleanBuilder predicate = new BooleanBuilder();
// oneliner with Java 8 forEach
values.forEach( value -> predicate.and(path.containsIgnoreCase(value)));
return Optional.of(predicate);
});
/*createdDate=dd/MM/yyyy&createdDate=dd/MM/yyyy
* or createdDate=dd/MM/yyyy*/
bindings.bind(root.alertDate)
.all((path, value) -> {
List<? extends Date> dates = new ArrayList<>(value);
if (dates.size() == 1) {
return Optional.of(path.eq(dates.get(0)));
} else {
Date from = dates.get(0);
Date to = dates.get(1);
return Optional.of(path.between(from, to));
}
});
}
List<Violation> findAllGroupBySeverity(Predicate predicate, Pageable pageable);
}