Utilizzo il metodo PagingAndSortingRepository e findAll (Pageable pageable) per il paging dei miei dati. Penso che non ci sia modo di fornire alcuna condizione. Per esempio a volte voglio selezionare e indirizzi di paging in cui città = NY. C'è un modo per fornire condizioni e paging simultaneamente?Come combinare l'impaginazione con una query di criteri in Spring Data JPA?
risposta
Il PagingAndSortingRepository
appena aggiunge i metodi CRUD molto semplici in modalità di impaginazione. Come descrive lo reference documentation, è possibile semplicemente aggiungere un parametro Pageable
a qualsiasi metodo di query definito per ottenere l'impaginazione di questa query.
interface CustomerRepository implements Repository<Customer, Long> {
Page<Customer> findByLastname(String lastname, Pageable pageable);
List<Customer> findByFirstname(String firstname, Pageable pageable);
}
Il primo metodo restituirà un Page
che contiene la pagina di metadati come elementi totali disponibili ecc Per calcolare questi dati si innescherà una query conteggio aggiuntivo per la query derivata. Il secondo metodo di interrogazione restituisce il set di risultati con taglio semplice senza eseguire la query di conteggio.
Per Impaginazione avete bisogno di 2 metodi come getCount (paginabile paginabile) e findAll (paginabile paginabile)
Utilizzando questa funzionalità in Hibernate, tuttavia, è banale. Se avete qualsiasi domanda HQL si può semplicemente fare questo:
public Long getCount(Pageable pageable) {
Query q = session.createQuery("Select count(t) From TableClass t where t.city = 'NY'");
Long cnt = (Long) q.uniqueResult();
return cnt;
}
public List<TableClass> findAll(Pageable pageable) {
Query q = session.createQuery("From TableClass t where t.city = 'NY'");
q.setFirstResult(start);
q.setMaxResults(length);
List<TableClass> tableClasslist = q.list();
return tableClasslist;
}
Allo stesso modo, se si dispone di una query criteri, è effettivamente la stessa cosa:
public Long getCount(Pageable pageable) {
Criteria c = session.createCriteria(TableClass.class);
c.setProjection(Projections.rowCount());
Long cnt = (Long) c.uniqueResult();
return cnt;
}
public List<TableClass> findAll(Pageable pageable) {
Criteria c = session.createCriteria(TableClass.class);
c.setParameter("city","NY");
c.setFirstResult(start);
c.setMaxResults(length);
List<TableClass> tableClasslist = c.list();
return tableClasslist ;
}
Grazie per l'aiuto. Ho cercato la soluzione JPA ma DataNucleus ha rimosso JPA dai tag della domanda. Ho usato il tag hibernate per esprimere che Hibernate è il mio provider di persistenza. – Mariusz
Ciao @Olivier con Pageagle non vedo dove specificare l'offset, 'PageRequest' accetta solo' page' e 'size'. non vedo davvero perché devo fare 'page * size' per ottenere il mio' offset'. esiste un modo per usare 'offset' rispetto a' page'? –
La ragione per cui "PaginaRequest' espone' page' e 'size' come solo' offset' non è sufficiente dato che hai ancora bisogno di 'size'. Il concetto di impaginazione di solito implica una visione incentrata sulla pagina sui dati, che è ciò che esprimiamo qui. Ma nulla ti impedisce di realizzare la tua implementazione di 'Pageable' che funziona con offset e dimensioni. –
Come possiamo utilizzare Pagivation con l'API di query? –