2012-04-13 18 views
7

Me disculpo por hacer esta pregunta si alguien ya lo hizo y por hacer una pregunta quizás tonta pero soy nuevo en esto y usted es experto y me gustaría aprender de su consejo experto y experiencia.Jpa paging con números y siguiente, anterior

Quiero agregar paginación a una aplicación que muestra 200 registros por página. La parte inferior de la página debe tener números. Si hay 1050, la primera página mostrará 100 y la parte inferior de la página mostrará los números 1,2,3,4,5 & 6.

¿Cuál es la lógica general para lograr esto? Sé que la base de datos debe seleccionar 200 cada vez y debo hacer un seguimiento del primer registro.

  1. ¿Hay alguna forma de saber cuántos registros se devolverán en total para que pueda saber cuántos números mostrar en la parte inferior de la página? ¿Requiere seleccionar una declaración count() o algo más?
  2. Para los 1050 registros, se mostrarán los números 1,2,3,4,5 & 6 y al hacer clic en cada uno se requiere una llamada al servidor. ¿Hay alguna forma de saber cuántos registros se devolverán en la próxima llamada al servidor? ¿Requiere seleccionar una declaración count() o algo más?
+0

Gracias a todos por tomarse el tiempo para responder a mi pregunta. Actualizaré mi código y le diré si tengo más preguntas sobre esto. – javafun

Respuesta

6

Puede usar el JPA Criteria API para lograr esto. Suponiendo TypedQuery, usaría setFirstResult y setLastResult para limitar los registros devueltos desde la base de datos. Por supuesto, los valores para estos métodos dependerán de qué página se solicitó y cuántos registros se muestran por página.

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

Nota: Esto supone la primera página es 1 (en contraposición a cero).

Para obtener un recuento de registros, ejecuta una consulta Criteria estándar. Como ejemplo:

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

Puede personalizar el código anterior para realizar el conteo relativo a otra consulta también. Finalmente, necesita alguna forma de comunicar el recuento total al cliente. Una forma de hacerlo es envolviendo el conjunto de resultados de su consulta en otro objeto que contiene un atributo para el recuento, o devuelve dicho objeto como resultado de su llamada DAO. O, como alternativa, puede almacenar el atributo de conteo en un objeto en el alcance de su solicitud.

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

    // constructor, getters, setters 
} 
+0

¡Gracias también! – javafun

0

Sí, tiene que hacer una cuenta de selección antes de obtener las filas.

2

Por lo general, se realizará la misma consulta, excepto que se usará count en la lista de selección en lugar de las columnas antes de ejecutar la consulta real para encontrar cuántas páginas hay. El conseguir una página específica en hibernación y luego se puede hacer con algo como:

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

Si se realiza la consulta extra es demasiado caro una operación entonces usted podría considerar simplemente proporcionando siguientes enlaces/anterior o proporcionar alternativamente páginas adicionales según sea necesario (por ejemplo, A medida que el último de los datos cargados aparece a la vista) a través de ajax.

Para mostrar los resultados de paginación, incluyendo la visualización de enlaces de número de página que sugeriría (suponiendo que esté utilizando páginas jsp para mostrar estos datos) utilizando la biblioteca de etiquetas JSP display tag. La etiqueta de visualización maneja la paginación y clasificación de la visualización de los datos tabulares suponiendo que puede obtenerla en el JSP.

+0

¡Gracias por tu ayuda! – javafun

0

Eche un vistazo a Spring Data JPA. Básicamente está trabajando cómo la percepción sugirió antes, solo que no tienes que hacerlo, el marco hace eso por ti. Obtienes paginación y clasificación por defecto (aún tienes que filtrar tú mismo si no quieres usar Query DSL).

Tienen un video de 1 hora en la página principal que muestra una introducción rápida, pero solo necesitarás verlo durante 15 minutos para hacerte una idea de lo que hace la identificación.

Cuestiones relacionadas