2014-12-04 71 views
2

我想在Spring应用程序中实现分页。我知道使用存储库,我们可以实现分页,但我们不能写我们自己的查询数据检索存储库中有限的方法,也没有方法接受查询类。春季自定义查询与可分页

如果我们想编写我们的自定义查询来从mongodb中检索数据,我们必须使用mongotemaplete,因为我知道mongotemplate我们不能实现分页。

是否有任何其他方式与db查询一起实现分页。 任何人都可以帮助我。

回答

0

通过扩展Sp​​ring数据PagingAndSortingRepository界面,你可以得到一些常用的方法,如保存,查找,和的findAll删除,你也可以添加自己的自定义查询:

public interface Repository extends PagingAndSortingRepository<Book, ID extends Serializable> { 

    // Common method 
    Page<Book> findAll(Pageable pageable); 

    // Custom query based on Spring Data naming convention 
    Page<Book> findByNameOrDescription(String name, String description, Pageable pageable); 

} 
1

使用MongoRepository。 扩展MongoRepository作为

public interface FooRepository extends MongoRepository<Foo,String> {  
    @Query(value="{'name': ?0}"); 
    Page<Foo> findByMethod(String name, Pageable pageable); 
} 

然后,用它作为

Page fooPage = FooRepository.findByMethod('John', new PageRequest(0,20)); 
1

只是把它万一有人需要它。

SpringData具有自定义查询的方法:

final Pageable pageableRequest = new PageRequest(0, 2); 
Query query = new Query(); 
query.with(pageableRequest); 
7

当你想通了,MongoTemplate不支持完整的页面抽象。就像KneeLess说的那样,你可以使用@Query -Annotation来做一些自定义查询。

如果这对您不够用,可以使用Spring Repository PageableExecutionUtils与您的MongoTemplate结合使用。

例如像这样:

@Override 
public Page<XXX> findSophisticatedXXX(/* params, ... */ @NotNull Pageable pageable) { 

    Query query = query(
      where("...") 
      // ... sophisticated query ... 
    ).with(pageable); 

    List<XXX> list = mongoOperations.find(query, XXX.class); 
    return PageableExecutionUtils.getPage(list, pageable, 
      () -> mongoOperations.count(query, XXX.class)); 
} 

春库正在做的一样。正如你可以看到here,它们也会触发两个查询。

+2

那个杀手参考!我正在寻找几个小时!的xD – Bowen 2017-11-29 17:56:47