2012-10-08 40 views

Respuesta

10

El PagingAndSortingRepository sólo se suma a los métodos muy básicos CRUD en modo de paginación. Como se describe en reference documentation, simplemente puede agregar un parámetro Pageable a cualquier método de consulta que defina para lograr la paginación de esta consulta.

interface CustomerRepository implements Repository<Customer, Long> { 

    Page<Customer> findByLastname(String lastname, Pageable pageable); 

    List<Customer> findByFirstname(String firstname, Pageable pageable); 
} 

El primer método devolverá un Page que contiene los metadatos página como elementos totales disponibles etc. Para calcular estos datos se activará una consulta de recuento adicional para la consulta derivada. El segundo método de consulta devuelve el conjunto de resultados sin formato sin que se ejecute la consulta de recuento.

+0

Hola @Olivier con Pageagle, no veo dónde especificar el 'offset',' PageRequest' solo acepta 'page' y' size'. Realmente no veo por qué tengo que hacer 'page * size' para obtener mi' offset'. ¿Hay alguna forma de usar 'offset' en lugar de' page'? –

+1

El motivo 'PageRequest' expone' page' y 'size' ya que solo' offset' no es suficiente ya que aún necesita el 'size'. El concepto de paginación generalmente implica una vista centrada en la página en los datos, que es lo que expresamos aquí. Pero nada le impide crear su propia implementación de 'pageable' que funciona con compensaciones y tamaños. –

+0

¿Cómo podemos usar Pagivation con Query API? –

2

Para paginación necesita 2 métodos como getCount (paginable paginable) y findAll (paginable paginable)

Utilizando esta funcionalidad en hibernación, sin embargo, es trivial. Si tiene cualquier consulta HQL puede simplemente hacer esto:

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; 
} 

Del mismo modo, si usted tiene una consulta Criteria, que es efectivamente lo mismo:

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 ; 
} 
+0

Gracias por la ayuda. Busqué la solución JPA, pero DataNucleus eliminó JPA de las etiquetas de la pregunta. Usé la etiqueta de hibernación para expresar que Hibernate es mi proveedor de persistencia. – Mariusz

Cuestiones relacionadas