如何在带有自定义过滤器的 Spring Data mongodb 中使用分页和排序?

Posted

技术标签:

【中文标题】如何在带有自定义过滤器的 Spring Data mongodb 中使用分页和排序?【英文标题】:How use Paging and Sorting in Spring Data mongodb with custom filter? 【发布时间】:2018-03-27 14:40:34 【问题描述】:

在 Spring Data JPA 中,我们有规范,可以使用规范的分页和排序。

public interface JpaSpecificationExecutor<T> 

    T findOne(Specification<T> var1);

    List<T> findAll(Specification<T> var1);

    Page<T> findAll(Specification<T> var1, Pageable var2);

    List<T> findAll(Specification<T> var1, Sort var2);

    long count(Specification<T> var1);


但是在 MongoRepository 中没有办法使用这样的功能。 我尝试使用 QueryByExampleExecutor,但它非常有限 示例我想要过滤数据的年份 >5 和

【问题讨论】:

见jira.spring.io/browse/DATAMONGO-1481 【参考方案1】:

您可以参考以下代码:

@Repository
public class DataRepository `enter code here`
    @Autowired
    MongoTemplate mongoTemplate;
    public Page<Data> filterData(SearchDTO searchDTO)
        List<Data> list = null;
        Integer offset = Optional.ofNullable(searchDTO.getOffset()).orElse(0);
        Integer limit = Optional.ofNullable(searchDTO.getLimit()).orElse(10);
        int page = offset / limit;
        Pageable pageable = PageRequest.of(page, limit);
        Query query = new Query();
        /** your filter condition */
        // if (!StringUtils.isEmpty(searchDTO.getName())) 
    //      query.addCriteria(Criteria.where("name").is(searchDTO.getName()));
    //   
        query.with(pageable);
        list = mongoTemplate.find(query, Data.class);
        return PageableExecutionUtils.getPage(list, pageable,
         ()-> mongoTemplate.count(query, Data.class));
      


【讨论】:

以上是关于如何在带有自定义过滤器的 Spring Data mongodb 中使用分页和排序?的主要内容,如果未能解决你的问题,请参考以下文章

带有 MyBatis 的 Spring Data JDBC 找不到自定义查询

Spring Security +自定义用户对象附加到会话以过滤请求

Spring Data JPA - 带有“@Param Date”的自定义@Query 不起作用

带有自定义过滤器的 Kendo MVVM Grid

如何在 Spring Security 中编写自定义过滤器?

如何自定义 websocket 握手和/或添加过滤器?