Próbuję utworzyć nowy Page
przy użyciu listy obiektów pobranych z bazy danych. Najpierw otrzymuję wszystkie elementy z DB, konwertuję je do strumienia, a następnie używam lambda do filtrowania wyników. Następnie potrzebuję strony z określoną liczbą elementów, jednak utworzenie nowej wartości PageImpl
nie zwróci strony o prawidłowym rozmiarze.Strona danych sprężyn Nie powracasz na stronę o poprawnym rozmiarze?
Oto mój kod:
List<Produtos> listaFinal;
Stream<Produtos> stream = produtosRepository.findAll().stream();
listaFinal = stream.filter(p -> p.getProdNome().contains("uio")).collect(Collectors.toList());
long total = listaFinal.size();
Page<Produtos> imp = new PageImpl<>(listaFinal,pageable,total);
Oto zrzut ekranu z debugowania:
Uwaga wielkość w stronicowalnej obiektu jest ustawiona na 20, a ona rozumie, że potrzebuje 4 strony aby wyświetlić 70 elementów, ale zwraca całą listę.
Czego mi brakuje?
Edycja odpowiedzi na komentarz wykonany przez Tomasza:
rozumiem jak używać stronę, aby powrócić tylko kawałek danych. Kod, który pokazałem, był moją próbą użycia wyrażenia lambda do filtrowania mojej kolekcji. Problemem dla mnie jest to, że chcę użyć lambda Java 8, aby wysłać zapytanie do bazy danych poprzez Spring Data JPA. Jestem przyzwyczajony do wyrażeń zapytań VB.NET i Entity function(x)
i zastanawiałem się, jak to samo zrobić z Spring JPA.
W moim repozytorium używam extends JpaRepository<Produtos, Integer>, QueryDslPredicateExecutor<Produtos>
, co daje mi dostęp do findAll(Predicate,Pageable)
. Jednak predykatu nie wpisano, więc nie mogę po prostu użyć w zapytaniu p -> p.getProdNome().contains("uio")
. Używam SQL Server i Hibernate.
Nice! Zrobię to z tym, nad czym pracuję. – stites
Czy możesz podać mi kod, którego używasz do PageImpl? Mam teraz ten sam problem! – user3127109
Kod został dodany. Zauważ, że ta implementacja była potrzebna w moim przypadku, ponieważ miałem do czynienia z usługą REST, a domyślna implementacja nie działała dla mnie, może być inna w twoim przypadku. – dubonzi