【问题标题】:Spring data mongo paginationSpring数据mongo分页
【发布时间】:2013-12-20 10:13:24
【问题描述】:

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

StoryRepo extends PagingAndSortingRepository<Story, String>{}

因为 PagingAndSortingRepository 提供了用于分页查询的 api,所以我可以像这样使用它:

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

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

【问题讨论】:

  • 如何在spring数据mongo分页中将List转换为Page
  • 可以通过page.getContent()获取列表

标签: mongodb pagination spring-data


【解决方案1】:

您不需要像自动装配 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);

【讨论】:

  • 已弃用。使用PageRequest.of()
【解决方案2】:

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

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;

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

【讨论】:

  • 看起来像 query.with(pageable);没有给出正确的数据顺序或分页,很奇怪......
【解决方案3】:

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

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 个元素。

【讨论】:

    【解决方案4】:

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

    public interface PersonRepository extends MongoRepository<Person, String> {
        Page<Person> findByFirstname(String firstname, Pageable pageable);
    }
    

    更多详情请参考https://docs.spring.io/spring-data/mongodb/docs/1.2.0.RELEASE/reference/html/mongo.repositories.html中例6.6中的第二个查询

    【讨论】:

      【解决方案5】:

      该方法由特定于商店的类实现。对于 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) {
          …
        }
      }
      

      【讨论】:

      • 如何使用 Spring Repository 或 Query 从 mongo 获取 LastRecord?
      • 请创建一个新问题。
      【解决方案6】:
      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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-04
        • 2013-01-13
        • 2020-03-11
        • 1970-01-01
        • 1970-01-01
        • 2019-08-31
        • 2018-11-15
        • 2019-05-02
        相关资源
        最近更新 更多