2012-02-24 15 views
11

Tengo una interfaz de repositorio con algunos métodos abstractos donde utilizo la anotación @Query. Ahora me gustaría agregar soporte de límite y desplazamiento a estas consultas.Anotación de consultas JPQL con límite y desplazamiento

ejemplo:

public interface ProductRepository 
    extends CrudRepository<Product, Long> { 

    @Query("from Product") 
    List<Product> findAllProducts(); 
} 

algo como esto sería bueno

public interface ProductRepository 
    extends CrudRepository<Product, Long> { 

    @Query("from Product limit :limit ") 
    List<Product> findAllProducts(@Param("limit") Integer limit); 
} 

Pero esto no funciona. Existe una solución que creo una implementación de la interfaz (http://stackoverflow.com/questions/3479128/jpql-limit-number-of-results) Pero me pregunto si no existe la posibilidad de agregar offset y límite a la consulta o si hay una anotación para esto.

+0

¿Por qué no simplemente implementa el método y utiliza la API JPA? Las anotaciones son geniales, pero se supone que no deben reemplazar todo el código de Java. –

+1

Es la forma estándar de usar y ampliar las interfaces de repositorio de Spring. –

+2

Escribiendo esto ... la manera estándar de resolver el problema fundamental es usar 'PagingAndSortingRepository'. –

Respuesta

5

limit no es compatible con JPQL. Incluso sin él, sus consultas no son válidas JPQL queries (pero pueden ser HQL válidas, y pueden funcionar si su proveedor de JPA es tolerante).

Se necesita una implementación (parcial) para que pueda usar la interfaz Query o la API de criterios.

9

1 a lo que el usuario "su" dijo en el comentario:

"la forma estándar para resolver el problema fundamental es el uso de PagingAndSortingRepository"

He aquí un ejemplo. Estoy tirando en la clasificación simplemente como una ventaja adicional:

public interface ArtifactRepo extends JpaRepository<Artifact, Long> { 
    Page<Artifact> findByComponentKey(String componentKey, Pageable pageable); 
} 

(Usted puede usar @Query anterior, si se quiere, pero no JPQL propio soporte límites, como "su", señaló.)

a continuación, cuando se llama a ella, utilizar

PageRequest pageRequest = 
    new PageRequest(0, 1, Sort.Direction.DESC, "buildNumber"); 
Page<Artifact> artifactsPage = 
    artifactRepo.findByComponentKey(componentKey, pageRequest); 

escribí varias entradas de blog sobre este tema, que puede resultar muy útil:

http://springinpractice.com/blog/categories/chapter-02-data/

Cuestiones relacionadas