2012-04-13 13 views
7

Przepraszam, że zadałem to pytanie, jeśli ktoś już zadał to pytanie i zadał głupie pytanie, ale jestem na to nowy, a ty jesteś ekspertem i chciałbym uczyć się na podstawie twoich porad ekspertów i doświadczenie.Jp pager z numerami i następny, poprzedni

Chcę dodać stronicowanie do aplikacji wyświetlającej 200 rekordów na stronie. W dolnej części strony powinny znajdować się liczby. Jeśli jest 1050, pierwsza strona wyświetli 100, a na dole strony pojawią się numery 1,2,3,4,5 & 6.

Jaka jest ogólna logika, aby to osiągnąć? Wiem, że baza danych musi wybrać 200 za każdym razem i muszę śledzić pierwszy rekord.

  1. Czy istnieje sposób, aby dowiedzieć się, ile rekordów zostanie zwrócony w sumie, tak aby wiedzieć, ile liczb do wyświetlenia na dole strony? Czy wymaga to wyboru instrukcji count() lub czegoś innego?
  2. Dla rekordów 1050, numery 1,2,3,4,5 & 6 zostaną wyświetlone, a kliknięcie każdego z nich wymaga połączenia z serwerem. Czy istnieje sposób sprawdzenia, ile rekordów zostanie zwróconych podczas następnego połączenia z serwerem? Czy wymaga to wyboru instrukcji count() lub czegoś innego?
+0

Dziękuję wszystkim za poświęcenie czasu na odpowiedź na moje pytanie. Zaktualizuję mój kod i dam ci znać, jeśli będę miał dalsze pytania na ten temat. – javafun

Odpowiedz

6

Do wykonania tej czynności można użyć JPA Criteria API. Zakładając, że TypedQuery użyjesz setFirstResult i setLastResult do ograniczenia rekordów zwróconych z bazy danych. Oczywiście wartości tych metod będą zależały od żądanej strony i liczby rekordów wyświetlanych na stronie.

first = (page - 1) * page size; 
last = (page * size) - 1; 

Uwaga: to zakłada, że ​​pierwsza strona 1 (w przeciwieństwie do zera).

Aby uzyskać rekord, należy wykonać standardowe zapytanie Kryteria. Na przykład:

final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); 
final CriteriaQuery<Long> countQuery = builder.createQuery(Long.class); 
countQuery.select(builder.count(countQuery.from(MyEntity.class))); 
final Long count = entityManager.createQuery(countQuery) 
     .getSingleResult(); 

Możesz dostosować powyższy kod, aby wykonać obliczenia względem innego zapytania. Wreszcie, potrzebujesz sposobu na przekazanie całkowitej liczby z powrotem do klienta. Jednym ze sposobów na to jest zawijanie zestawu wyników zapytania w innym obiekcie, który zawiera atrybut liczby, lub zwraca ten obiekt w wyniku twojego połączenia DAO. Lub alternatywnie możesz przechowywać atrybut count w obiekcie w swoim zasięgu żądania.

public class ResultListWrapper<T> { 
    private Long count; 
    private Collection<T> results; 

    // constructor, getters, setters 
} 
+0

Dziękuję również! – javafun

0

Tak, przed wykonaniem samych wierszy należy wykonać wybraną liczbę.

2

Zazwyczaj wykonujesz to samo zapytanie, z wyjątkiem użycia count int listy wyboru zamiast kolumn przed uruchomieniem faktycznego zapytania, aby znaleźć liczbę stron. Pierwsze konkretne strony w hibernacji można wtedy zrobić coś podobnego:

int maxRecords = // page size ... 
int startRow = // page number * page size 
Query query = session.createQuery('...'); 
query.setMaxResults(maxRecords); 
query.setFirstResult(startRow); 

przypadku wykonywania dodatkowych zapytanie jest zbyt kosztowna operacja wtedy można rozważyć tylko dostarczenie następnego/poprzedniego łącza lub alternatywnie dostarczenie dodatkowych stron, ile potrzeba (np Gdy pojawi się ostatni z załadowanych danych) przez ajax.

Do wyświetlania wyników stronicowanych, w tym pokazujących linki do numerów stron, sugerowałbym (zakładając, że używasz stron JSP do wyświetlania tych danych) przy użyciu biblioteki znaczników JSP display tag. Tag wyświetlania obsługuje stronicowanie i sortowanie wyświetlania danych tabelarycznych, zakładając, że możesz je przekazać na stronę JSP.

+0

Dzięki za pomoc! – javafun

0

Spójrz na Spring Data JPA. Zasadniczo działa to jak sugeruje wcześniej Perception, tylko że nie musisz tego robić, framework to robi dla ciebie. Domyślnie uzyskujesz stronicowanie i sortowanie (nadal nie musisz używać filtrowania, jeśli nie chcesz używać Query DSL).

Mają 1h wideo na stronie głównej, która pokazuje szybkie wprowadzenie, ale musisz tylko obejrzeć około 15 minut, aby zorientować się, co robi id.

Powiązane problemy