2012-09-28 15 views
7

Estamos utilizando Spring Data con PageRequest y con un conjunto de datos significativamente grande. Todas las consultas tienen un rendimiento óptimo, excepto que la consulta se ejecuta para obtener el número total de páginas. ¿Hay alguna manera de desactivar esta característica o es probable que tengamos que implementar nuestra propia paginable?¿Cómo se desactiva la consulta de recuento de PageRequest para obtener el total de páginas?

http://static.springsource.org/spring-data/data-commons/docs/1.3.2.RELEASE/api/org/springframework/data/domain/PageRequest.html

http://static.springsource.org/spring-data/data-commons/docs/1.3.2.RELEASE/api/org/springframework/data/domain/Pageable.html

Editar: Después de un análisis más detallado Creo que la única manera de evitar este problema es no utilizar datos de primavera y utilizar EntityManager, ya que permite el ajuste de la fila de inicio y el número de registros que se regreso. Solo necesitamos si la página siguiente está disponible, así que solo recuperamos un registro adicional. También necesitamos una consulta dinámica que no parece posible en Spring Data.

Editar 2: Y parece que simplemente no esperé lo suficiente para algunas respuestas. ¡¡¡Gracias chicos!!!

Respuesta

17

La forma de lograr esto es simplemente usando List como valor de retorno. Así, por ejemplo, para un repositorio definido así:

interface CustomerRepository extends Repository<Customer, Long> { 

    List<Customer> findByLastname(Stirng lastname, Pageable pageable); 
} 

se aplicaría El motor de ejecución de la consulta del offset y PageSize como en mano por el Pageable pero no desencadenar la consulta recuento adicional que no necesitamos para construir un Page ejemplo. Esto también se documentó en el relevant sections de la documentación de referencia.

+0

Hola Oliver, ¿es posible hacer lo mismo usando el método findAll()? Algo así como List findAll (pageable pageable)? (para que sea posible generar algo como: SELECCIONAR * DESDE LA TABLA ORDER BY xxx LIMIT yyy)? No encontré la manera de hacerlo (y comencé una "guerra de llama" con Ralph en este hilo) :-) –

+0

¿Qué pasa si quiero obtenerlos todos en una página? Es decir, ignorando la paginación. ¿Puedo hacer algo como la nueva PageRequest (0, 0)? – Stephane

+0

@StephaneEybert - si quiere todo, simplemente deje fuera el parámetro Pageable de la definición de su método. Por supuesto, debes tener cuidado con esto y con los conjuntos de datos gigantes. – JBCP

Cuestiones relacionadas