将可分页投影与QueryDSLPredicates一起使用

时间:2019-05-02 20:56:24

标签: spring-boot spring-data-mongodb querydsl

嗨,我正在尝试基于QueryDSLPredicate在Spring Boot中检索特定文档/实体中的所有记录。响应必须是可分页的。我有点想做这样的事情。

Page<ViolationMinInfo> findAllProjectedBy(Predicate predicate, Pageable pageable);

其中ViolationMinInfo是我的Violation实体的投影。我有一个用例,也需要我使用此方法。

Page<Violation> findAll(Predicate predicate, Pageable pageable);

但是,当我使用第一种方法时,Spring数据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);

}

0 个答案:

没有答案