如何在Spring Data REST中从Page获取List

时间:2016-08-06 23:25:44

标签: java spring pagination spring-data spring-restcontroller

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

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

如何实现这一目标,有没有办法将这些Page对象转换为List

3 个答案:

答案 0 :(得分:20)

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

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

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
   }
}

答案 1 :(得分:1)

我知道我迟到了,但是,这是它在Google中弹出的第一个选项,当所有页面的所有信息都需要转换为列表时,人们可能需要更多答案...

一个近似可以是:

xRepository.findAll(new PageRequest(0, Integer.MAX_VALUE)).getContent();

这里的问题是spring将最大大小设置为1000,因此您将获得最多1000个元素的列表。

另一种方法是使用不同的页面索引进行多次查找,然后使用getContent()将结果添加到列表中:

Page<T> pageData = xRepository.findAll(new PageRequest(0, 20));
List<T> finalList = pageData.getContent();
while(!pageData.isLast()){
    pageData = xRepository.findAll(pageData.nextPageable());
    List<T> listData = pageData.getContent();
    //append listData into finalList
}

答案 2 :(得分: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;
}

请选中此page,以获取按块获取数据的优缺点。