如何在 Spring Data REST 中从页面获取列表

新手上路,请多包涵

我正在使用 JPARespository 进行所有 CRUD 操作。最近我想实现排序,所以我继续 Pagable

问题是,我希望存储库方法返回 List 对象,我在服务层中使用它们。

我怎样才能做到这一点,有没有办法将这些 Page 对象转换为 List

原文由 Soumitri Pattnaik 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 739
2 个回答

如果您在 jpa 存储库方法中使用 pageable,spring 将始终返回一个页面而不是一个列表。我建议你有一个调用存储库方法并将页面结果的内容提取到列表中的服务方法。

因此,如果您的存储库方法是这样的:

 import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface RecordRepository extends JpaRepository<Record, Integer>{
     Page<Record> findAll(Pageable pageable);
}

那么你可以有一个服务类,它有一个调用存储库方法的方法

@Service
public class RecordService{

   @Autowired
   RecordRepository recordRepository;

  public List<Record> findAll(PageRequest pageRequest){
    Page<Record> recordsPage = recordRepository.findAll(pageRequest);
    return recordsPage.getContent();
  }
}

所以在你的调用类中而不是直接调用存储库你可以只使用该服务。因此:

 public class MyRecordImpl{
   @Autowired
  RecordService recordService;

  public void doSomething(){
      int page = 0; int pageSize = 5;
      List<Record> recordList = recordService.findAll(new PageRequest(page, pageSize, new Sort(Sort.Direction.DESC, "recordId")));
     //do other implementations here
   }
}

原文由 Sohlowmawn 发布,翻译遵循 CC BY-SA 3.0 许可协议

一次获取所有结果的最简单方法是使用 Pageable.unpaged() ,如下所示:

 Page<Employee> allEmployees = employeeRepository.findAll(Pageable.unpaged());
allEmployees.getContent();

但是,如果您担心一次检索太多数据,而是更喜欢以小块的形式进行检索,则可以使用类似于以下的服务或存储库方法:

 private List<Employee> findAll() {
    List<Employee> allEmployees = new ArrayList<>();

    // First page of employees -- 5000 results per page
    PageRequest pageRequest = PageRequest.of(0, 5000);
    Page<Employee> employeePage = employeeRepository.findAll(pageRequest);
    allEmployees.addAll(employeePage.getContent());

    // All the remaining employees
    while (employeePage.hasNext()) {
        Page<Employee> nextPageOfEmployees = employeeRepository.findAll(employeePage.nextPageable());
        allEmployees.addAll(nextPageOfEmployees.getContent());

        // update the page reference to the current page
        employeePage = nextPageOfEmployees;
    }

    return allEmployees;
}

检查此 页面 以了解以块形式获取数据的优点和缺点。

原文由 Chaithu Narayana 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题