繁体   English   中英

如何使用分页和 spring data jpa 获取 findAll () 服务的所有记录?

[英]How can I get all the records for findAll () service using pagination and spring data jpa?

当我们不应用过滤器时,如何使用分页和Spring Data JPA获取findAll ()服务的所有记录,它应该返回所有记录而不是按页面显示。我有findAll (Pageable pageable)服务并从自定义存储库调用它. 是否可以仅使用分页在一页中获取所有记录?

public interface UserRepository extends PagingAndSortingRepository<User, Long> {
    //Page<User> findAll(Pageable pageable); is already in this repository.
}

因此,如果您想找到大小为 20 的第一页,请尝试:

Page<User> users = repository.findAll(new PageRequest(0, 20));

如果您想做的是在一个页面上获取所有实体,那没有多大意义,但可以分两步完成:

int count = repository.count();
Page<User> users = repository.findAll(new PageRequest(0, count));

count()来自CrudRepository ,它由PagingAndSortingRepository扩展。

如果您正在使用 PagingAndSortingRepository 并且仍然想要“事物”列表,

您可以添加一个方法List<Thing> findBy()

如果您有 RepositoryRestResource,它将作为 REST 公开: /things/search/findBy

如果您不需要分页,请使用CrudRepository而不是PagingAndSortingRepository

现在 PageRequest 构造函数受到保护,您不能使用“新”创建。 你必须调用静态方法:

PageRequest.of(int page, int size)
PageRequest.of(int page, int size, @NotNull Sort sort)
PageRequest.of(int page, int size, @NotNull Direction direction, @NotNull String... properties)

解决方案如下:

Page<User> users = repository.findAll(PageRequest.of(0, 20));

当然,您的 UserRepository 接口应该是从 PagingAndSortingRepository 扩展而来的:

public interface UserRepository extends PagingAndSortingRepository<User, Long>

步骤1:

在您的存储库中,实现接口 JpaSpecificationExecutor,它作为重载的 findAll 方法,接受上面创建的规范对象和页面对象。

The method signature in interface is:    Page<T> findAll(@Nullable Specification<T> spec, Pageable pageable);

存储库类如下所示:

@Repository
public interface MyRepository extends
  CrudRepository<JobRecord, Long>,
  JpaSpecificationExecutor<JobRecord> {

使用谓词实现您的自定义规范

  static Specification<JobRecord> findByParam1AndParam2AndParam3(String param1,String param2,String param3) {
    return (jobRecord, cq, builder) -> {
      List<Predicate> predicates = new ArrayList<>();
      predicates.add(builder.equal(jobRecord.get("param1"), "param1"));
      predicates.add(builder.equal(jobRecord.get("param2"), "param2"));
      predicates.add(builder.equal(jobRecord.get("param3"), "param3"));
      // we can add  sorting here
      cq.orderBy(cb.desc(jobRecord.get("submittedAt")));
    // AND all predicates
      return builder.and(predicates.toArray(new Predicate[0]));
    };
  }

第2步:

在您的服务中,创建一个 Pageable 页面对象:

Pageable page = PageRequest.of(0, 5);// 0 is the firstResult and 5 is pageSize which we can fetch from queryParams 

findAll 方法可以与分页一起使用:--

List<Job> jobs = repository.findAll(findByParam1AndParam2AndParam3("param1","param2","param3"), page)
      .stream()
      .map(JobRecord::toModel)
      .collect(Collectors.toList());
    return new JobList().jobList(jobs);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM