2016-08-06 28 views
5

Używam JPARespository dla całej mojej operacji CRUD. Niedawno chciałem zaimplementować sortowanie, więc poszedłem do przodu z Pagable.Jak uzyskać listę ze strony w Spring Data REST

Problem polega na tym, że chcę, aby metody repozytoryjne zwracały obiekty List, używam ich w mojej warstwie usług.

W jaki sposób mogę to osiągnąć, czy istnieje sposób przekonwertowania tych obiektów Page na List?

Odpowiedz

8

Jeśli używasz strony w repozytorium jpa, sprężyna zawsze zwróci stronę, a nie listę. Sugeruję, że masz metodę usługi, która wywołuje metodę repozytorium i wyodrębnia zawartość wyniku strony do listy.

Więc jeśli repozytorium metoda jest tak:

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

wtedy można mieć klasę usług, która ma metodę, która wywołuje metodę repozytorium

@Service 
public class RecordService{ 

    @Autowired 
    RecordRepository recordRepository; 

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

więc w swojej klasie wywołującej zamiast dzwonić repozytorium bezpośrednio możesz skorzystać z usługi. tak:

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

ale czy '.getContent()' powrócić wszystko od wszystkich strony, czy tylko dane tej samej strony? – mmcrae

+1

@mmcrae the .getContent() zwraca tylko dane jednej strony. – Sohlowmawn

+0

Jak uzyskać wszystko ze wszystkich stron i przekonwertować je na listę? – gavinSong

1

wiem, że jestem późno, ale jest to pierwsza opcja to wyskakuje w google i ludzie mogą potrzebować więcej odpowiedzi, gdy wszystkie informacje o wszystkich stronach musi zostać przekształcona w liście ...

Jeden aproksymacji mogą być:

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

problem polega na tym, że wiosna wyznacza maksymalną wielkość do 1000 więc masz zamiar uzyskać listę maksymalnie 1000 elementów.

Innym ze sposobów może być wiele dowiedzieć z zmierzających indeksów stronę, a następnie dodanie do listy wyników z 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 
}