Использование Pageable проекций с QueryDSLPredicates - PullRequest
0 голосов
/ 02 мая 2019

Привет. Я пытаюсь получить все записи в конкретном документе / объекте при весенней загрузке на основе 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);

}
...