2015-05-19 23 views
7

Chciałem pobrać 5 ostatnich rekordów podmiotu. Ale nie można go pobrać przez Spring Data JPA.Spring Data JPA, czyli jak zdobyć ostatnią stronę poprzez stronę

Początkowo próbowałem uzyskać dane za pomocą zapytania LIMIT, ale LIMIT nie jest obsługiwany w WZP.

Później próbowałem z interfejsem Pageable.

Pageable pageCount = new PageRequest(0, 10, Direction.ASC,"id"); 
List<TxnEntity> txnEntities = txnDAO 
      .findByAccountEntity(accountEntity,pageCount); 

Daje mi to pierwszą stronę z 10 obiektami.

Ale moim wymaganiem jest uzyskanie ostatnich 10 lub 5 obiektów. Jak mogę go uzyskać poprzez interfejs Pageable w ramach Spring?

+0

Najpierw określ całkowitą kwotę, odejmij liczbę potrzebnych rekordów i skonstruuj obiekt. –

+2

'Pageable pageCount = new PageRequest (0, 10, Direction.DESC," Id ");'? – redge

Odpowiedz

3

Wyjście spodziewałem było ostatnie N rekordów.

Więc użyłem wbudowana zapytanie

int n = 10; 

Pageable pageCount = new PageRequest(0, n); 

List<TxnEntity> txnEntities = txnDAO 
     .findByAccountEntityOrderByIdDesc(accountEntity,pageCount); 

Wiosna danych JPA 1.7 Teraz powróci ostatnich n rekordów.

DAO zwróci wszystkie rekordy w porządku malejącym, a korzystając z Pageable możemy uzyskać liczbę rekordów, których potrzebujemy od dołu.

To było proste.

uzyskać więcej zapytań JPA wbudowanych zapytań: http://docs.spring.io/spring-data/jpa/docs/current/reference/html/

0

Można odwrócić swój rodzaj, a następnie uzyskać pierwszy 5.

3

z dokumentacji referencyjnego:

Aby dowiedzieć się, ile stron można uzyskać dla zapytania całkowicie trzeba wyzwalać dodatkowa kwerenda liczenia. Domyślnie zapytanie to będzie pochodziło z zapytania, które faktycznie wywołujesz.

Można określić liczbę stron wydając zapytanie liczyć z góry:

Long count = txnDAO.countByAccountEntity(accountEntity); 
Pageable pageCount = new PageRequest((int)count/10, 10, Direction.ASC,"id"); 
+0

Powyższe rozwiązanie działa tylko wtedy, gdy liczba jest dokładna wielokrotność 10. np. I. Jeśli liczba to 30 to będę get pageRequest as (Number: 3, size: 10, Direction.ASC, "id"); , która daje mi 10 obiektów, zgodnie z oczekiwaniami, jest ostatnia 10. , ale ii. jeśli liczba to 27 , wtedy otrzymam pageRequest jako (Liczba: 2, rozmiar: 10, Kierunek.ASC, "id"); , który daje mi tylko 7 elementów, ale spodziewany jest ostatni 10. – virsha

0

Tylko na odniesienie:

Zgodnie http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.limit-query-result

można również utworzyć metodę findTop5ByAccountEntityOrderByIdDesc(accountEntity) w swoim repozytorium. Wolałbym to od rozwiązania z dodatkowym zapytaniem o liczenie.

Jeśli chcesz, możesz również dodać parametr Pageable, ale nie ma to większego sensu.

Istnieje jednak kilka potencjalnych problemów: identyfikator nie jest naturalnym sposobem na znalezienie "ostatnich" wpisów. Zawsze da ci to taki sam wynik, ale w zależności od strategii generowania i tego, jak identyfikatory są potencjalnie buforowane, nie ma gwarancji, że ostatnia "zapisana" jednostka ma najwyższy identyfikator. To może działać w 90% przypadków, ale powinieneś zachować ostrożność.

Czy to właśnie zamierzałeś zrobić?

Powiązane problemy