具有可分页的Spring自定义查询

Tri*_*ama 10 spring mongodb spring-data spring-data-mongodb spring-boot

我想在spring应用程序中实现分页.我知道使用存储库我们可以实现分页但我们不能编写自己的数据检索查询存储库中有限的方法也没有接受查询类的方法.

如果我们想编写自定义查询以从mongodb检索数据,我们必须使用mongotemaplete,因为我知道使用mongotemplate我们无法实现分页.

有没有其他方法可以实现分页以及db查询.任何人都可以帮助我.

d0x*_*d0x 20

正如您所知,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));
}
Run Code Online (Sandbox Code Playgroud)

Spring Repositories也在做同样的事情.正如您在此处所看到的,它们也会触发两个查询.

  • 那个杀手参考!我一直在寻找几个小时!的xD (2认同)

Kne*_*ess 8

使用MongoRepository。将MongoRepository扩展为

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

然后,将其用作

Page fooPage = FooRepository.findByMethod('John', new PageRequest(0,20));
Run Code Online (Sandbox Code Playgroud)


Cha*_*zar 5

通过扩展 Spring Data PagingAndSortingRepository接口,您可以获得一些常用方法,例如 save、find、findAll 和 delete,您还可以添加自己的自定义查询:

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);

}
Run Code Online (Sandbox Code Playgroud)


Jac*_*ack 5

只是把它放出来,以防有人需要。

SpringData有一个用于自定义查询的方法:

final Pageable pageableRequest = new PageRequest(0, 2);
Query query = new Query();
query.with(pageableRequest);
Run Code Online (Sandbox Code Playgroud)

  • @viniciusgati,我认为这是因为 API 在以后的版本中发生了变化。新的等效项是“PageRequest.of(0, 2)” (2认同)