Spring数据mongo分页

phu*_*ong 8 pagination mongodb spring-data

我想用Spring Data Mongo实现分页.有许多教程和文档建议使用PagingAndSortingRepository,如下所示:

StoryRepo extends PagingAndSortingRepository<Story, String>{}
Run Code Online (Sandbox Code Playgroud)

因此,因为PagingAndSortingRepository为分页查询提供api,我可以使用它:

Page<Story> story = storyRepo.findAll(pageable);
Run Code Online (Sandbox Code Playgroud)

我的问题是这里的findAll方法实际上是在哪里实现的?我需要自己编写实现吗?实现StoryRepo的StoryRepoImpl需要实现这个方法吗?

Sim*_*mon 16

您不需要像自动装配Spring对象PagingAndSortingRepository那样实现该方法,它会自动为您实现该方法.

请注意,由于您使用的是Mongodb,因此您可以扩展MongoRepository.

然后在Spring中,使用以下命令启用分页:

@RequestMapping(value="INSERT YOUR LINK", method=RequestMethod.GET)
  public List<Profile> getAll(int page) {
    Pageable pageable = new PageRequest(page, 5); //get 5 profiles on a page
    Page<Profile> page = repo.findAll(pageable);
    return Lists.newArrayList(page);
Run Code Online (Sandbox Code Playgroud)

  • 不推荐使用。使用`PageRequest.of()` (2认同)

phu*_*ong 7

我通过编写自己的实现来实现它,如下所示:

List<Story> stories = null;

Query query = new Query();
query.with(pageable);

stories = getTemplate().find(query, Story.class);

long total = getTemplate().count(query, Story.class);
Page<Story> storyPage = new PageImpl<Story>(stories, pageable, total);

return storyPage;
Run Code Online (Sandbox Code Playgroud)

我正在使用spring data&mongodb,使用mongo模板查询数据.


小智 5

在 Spring Data 中,您使用 Spring data 使用的命名约定创建一个接口并添加一个方法,框架将生成该方法的实现。为了实现分页,我在我的存储库中创建了这个方法声明:

public interface PersonRepository extends MongoRepository<Person, ObjectId> {
    Page<Person> findByName(String name, Pageable pageable);
}
Run Code Online (Sandbox Code Playgroud)

然后,在我的服务中,我这样调用这个方法:

Page<Person> persons = personRepository.findByName("Alex", PageRequest.of(0, 100));
Run Code Online (Sandbox Code Playgroud)

这里,页面将包含 100 个元素。


Oli*_*ohm 1

该方法由特定于商店的类实现。对于 Spring Data JPA 模块,它是SimpleJpaRepository. 您通常让 DI 容器为这些存储库接口创建实例。使用 Spring,您可以通过使用@EnableJpaRepositoryJavaConfig 类或

\n\n
<jpa:repositories base-package="com.acme.repositories" />\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将为存储库创建一个代理实例,以便您可以将其注入到您的客户端中:

\n\n
class MyClient {\n\n  @Inject\n  public MyClient(PersonRepository repository) {\n    \xe2\x80\xa6\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n