web-dev-qa-db-ja.com

Spring Dataのページからリストを取得する方法REST

すべてのCRUD操作にJPARespositoryを使用しています。最近、ソートを実装したかったので、Pagableを使用しました。

問題は、リポジトリメソッドがListオブジェクトを返すようにし、それらをサービスレイヤーで使用することです。

どうすればこれを達成できますか?これらのPageオブジェクトをListに変換する方法はありますか?

10

Jpaリポジトリメソッドでpageableを使用する場合、springは常にListではなくPageを返します。リポジトリメソッドを呼び出し、ページ結果のコンテンツをリストに抽出するサービスメソッドを用意することをお勧めします。

したがって、リポジトリメソッドが次のようになっている場合:

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

すべての結果を一度に取得する最も簡単な方法は、以下のように 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 チャンクでデータを取得することの利点と欠点について。

1

私は遅れていることを知っていますが、これはGoogleでポップする最初のオプションであり、すべてのページのすべての情報をリストに変換する必要がある場合、人々はより多くの答えを必要とするかもしれません...

1つの近似は次のとおりです。

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

ここでの問題は、スプリングが最大サイズを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
}
1
Noki