Implementazione del paging dei risultati in ibernazione (ottenendo il numero totale di righe)

StackOverflow https://stackoverflow.com/questions/1600215

Domanda

Come posso implementare il paging in Hibernate? Gli oggetti Query ha metodi chiamati setMaxResults e setFirstResult che sono sicuramente utili. Ma dove posso ottenere il numero totale di risultati, in modo da poter mostrare il link all'ultima pagina dei risultati e stampare cose come i risultati da 200 a 250 di xxx ?

È stato utile?

Soluzione

Puoi usare Query.setMaxResults (int results) e Query.setFirstResult (int offset).

Modifica anche: non c'è modo di sapere quanti risultati otterrai. Quindi, per prima cosa devi eseguire una query con " select count (*) ... " ;. Un po 'brutto, IMHO.

Altri suggerimenti

È necessario eseguire una query separata per ottenere i risultati massimi ... e nel caso in cui tra il tempo A della prima volta il client invia una richiesta di paging al tempo B quando viene emessa un'altra richiesta, se vengono aggiunti nuovi record o alcuni record ora soddisfano i criteri, quindi è necessario interrogare nuovamente il massimo per riflettere tale. Di solito lo faccio in HQL in questo modo

Integer count = (Integer) session.createQuery("select count(*) from ....").uniqueResult();

per le query Criteria di solito inserisco i miei dati in un DTO come questo

ScrollableResults scrollable = criteria.scroll(ScrollMode.SCROLL_INSENSITIVE);
if(scrollable.last()){//returns true if there is a resultset
    genericDTO.setTotalCount(scrollable.getRowNumber() + 1);
    criteria.setFirstResult(command.getStart())
            .setMaxResults(command.getLimit());
    genericDTO.setLineItems(Collections.unmodifiableList(criteria.list()));
}
scrollable.close();
return genericDTO;

è possibile eseguire due query: una query di tipo count (*), che dovrebbe essere economica se non si uniscono troppe tabelle insieme e una seconda query con limiti impostati. Quindi sai quanti oggetti esistono ma prendi solo quelli visualizzati.

Puoi semplicemente impostareMaxResults sul numero massimo di righe che vuoi restituire. Non vi è alcun danno nell'impostazione di questo valore maggiore del numero di righe effettive disponibili. Il problema con le altre soluzioni è che ipotizzano che l'ordinamento dei record rimanga lo stesso ogni ripetizione della query e che non ci siano cambiamenti tra i comandi.

Per evitare che se si desidera veramente scorrere i risultati, è meglio usare ScrollableResults. Non gettare questo oggetto lontano dal paging, ma usarlo per mantenere i record nello stesso ordine. Per scoprire il numero di record da ScrollableResults, puoi semplicemente spostarti nell'ultima posizione (), quindi ottenere il numero di riga. Ricorda di aggiungere 1 a questo valore, poiché i numeri di riga iniziano a contare da 0.

Personalmente penso che dovresti gestire il paging nel front-end. So che non è così efficiente, ma almeno sarebbe meno soggetto a errori.

Se utilizzassi la cosa count (*) cosa succederebbe se i record venissero eliminati dalla tabella tra le richieste per una determinata pagina? Molte cose potrebbero andare male in questo modo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top