2012-04-13 14 views
7

Mi scuso per aver fatto questa domanda se qualcuno lo ha già chiesto e per chiedere una domanda forse stupida ma sono nuovo a questo e voi siete esperti e mi piacerebbe imparare dai vostri consigli e Esperienza.Jpa cercapersone con numeri e successivo, precedente

Desidero aggiungere il paging a un'applicazione che visualizza 200 record per pagina. Il fondo della pagina dovrebbe avere numeri. Se ci sono 1050, la prima pagina mostrerà 100 e la parte inferiore della pagina mostrerà i numeri 1,2,3,4,5 & 6.

Qual è la logica generale per realizzare questo? So che il database deve selezionare 200 ogni volta e devo tenere traccia del primo record.

  1. C'è un modo per sapere quanti record verranno restituiti in totale in modo da poter sapere quanti numeri visualizzare in fondo alla pagina? Richiede la selezione di una istruzione count() o qualcos'altro?
  2. Per i record 1050, i numeri 1,2,3,4,5 & 6 visualizzati e facendo clic su ognuno di essi richiede una chiamata al server. C'è un modo per sapere quanti record verranno restituiti nella prossima chiamata al server? Richiede la selezione di una istruzione count() o qualcos'altro?
+0

Grazie a tutti per aver trovato il tempo di rispondere alla mia domanda. Aggiornerò il mio codice e ti farò sapere se ho ulteriori domande a riguardo. – javafun

risposta

6

È possibile utilizzare lo JPA Criteria API per ottenere ciò. Supponendo che TypedQuery, si utilizzi setFirstResult e setLastResult per limitare i record restituiti dal database. Ovviamente i valori per questi metodi dipenderanno dalla pagina richiesta e dal numero di record visualizzati per pagina.

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

Nota: Ciò presuppone la prima pagina è 1 (in contrapposizione a zero).

Per ottenere un conteggio dei record si esegue una query di criteri standard. Ad esempio:

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

È possibile personalizzare il codice precedente per eseguire il conteggio relativo a un'altra query. Infine, è necessario un modo per comunicare il conteggio totale al cliente. Un modo per farlo è racchiudere il set di risultati della query in un altro oggetto che contiene un attributo per il conteggio o restituire detto oggetto come risultato della chiamata DAO. In alternativa, è possibile memorizzare l'attributo count in un oggetto nell'ambito della richiesta.

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

    // constructor, getters, setters 
} 
+0

Grazie anche a te! – javafun

0

Sì, è necessario eseguire un conteggio di selezione prima di ottenere le righe stesse.

2

Generalmente si esegue la stessa query tranne che utilizzando il conteggio int l'elenco di selezione anziché le colonne prima dell'esecuzione della query effettiva per trovare il numero di pagine disponibili. Ottenere una pagina specifica in Hibernate può quindi essere fatta con qualcosa di simile:

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

Se esegue la query in più è troppo costoso un'operazione allora si potrebbe prendere in considerazione solo fornendo seguente link/precedenti o fornendo in alternativa pagine in più, se necessario (ad esempio, Quando viene visualizzato l'ultimo dei dati caricati) tramite ajax.

Per visualizzare i risultati impaginati, compresi i collegamenti dei numeri di pagina, suggerirei (supponendo che si utilizzino le pagine jsp per visualizzare questi dati) utilizzando la libreria di tag JSP display tag. Il tag display gestisce la visualizzazione di paging e ordinamento dei dati tabulari assumendo che sia possibile ottenerlo sul JSP.

+0

Grazie per il tuo aiuto! – javafun

0

Dai un'occhiata allo Spring Data JPA. Funziona fondamentalmente come la Perception ha suggerito in precedenza, solo che non devi farlo, il framework lo fa per te. Per impostazione predefinita si ottengono il paging e l'ordinamento (è comunque necessario filtrare da soli se non si desidera utilizzare Query DSL).

Hanno un video di 1 ora nella pagina principale che mostra un'introduzione rapida, ma per vedere l'ID è necessario solo circa 15 minuti.

Problemi correlati