Spring数据mongo分页

时间:2013-12-04 04:09:54

标签: mongodb pagination spring-data

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

StoryRepo extends PagingAndSortingRepository<Story, String>{}

因为PagingAndSortingRepository为分页查询提供api,我可以像以下一样使用它:

Page<Story> story = storyRepo.findAll(pageable);

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

6 个答案:

答案 0 :(得分:14)

当您自动连接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);

答案 1 :(得分:6)

我通过编写自己的实现来实现它,就像这样:

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;

我正在使用弹簧数据&amp; mongodb,使用mongo模板查询数据。

答案 2 :(得分:2)

要对查询进行分页,您可以使用以下内容:

{
    "serviceErrorCode": 100,
    "message": "Not enough permissions to access: GET /me",
    "status": 403
}

有关详细信息,请参阅https://docs.spring.io/spring-data/mongodb/docs/1.2.0.RELEASE/reference/html/mongo.repositories.html

中示例6.6中的第二个查询

答案 3 :(得分:1)

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

来激活Spring Data存储库
<jpa:repositories base-package="com.acme.repositories" />

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

class MyClient {

  @Inject
  public MyClient(PersonRepository repository) {
    …
  }
}

答案 4 :(得分:1)

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

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

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

Page<Person> persons = personRepository.findByName("Alex", PageRequest.of(0, 100));

此处,页面将包含100个元素。

答案 5 :(得分:0)

Query query1 = new Query();
Integer startIndex = page * size;
Integer endIndex = (page * size) + size;

List<dto> totalRecord = mongoOperation.find(query1, dto.class);

query1.limit((endIndex > totalRecord.size() ? totalRecord.size() : endIndex));

List<dto> responseList = mongoOperation.find(query1, dto.class);

int end = (endIndex > (totalRecord.size() - 1) ? totalRecord.size() - 1 : endIndex);
if (totalRecord.size() > 0 && end == 0)
  end = 1;

if (totalRecord.size() > 0)
  responseList = responseList.subList(startIndex, end);

int totalPages = totalRecord.size() / size + (totalRecord.size() % size == 0 ? 0 : 1);