嗨,我正在尝试基于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);
}