2012-02-24 24 views
11

Ho un'interfaccia repository con alcuni metodi astratti in cui utilizzo l'annotazione @Query. Ora vorrei aggiungere il limite e il supporto di offset a queste domande.Annotazione query JPQL con limite e offset

esempio:

public interface ProductRepository 
    extends CrudRepository<Product, Long> { 

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

qualcosa come questo sarebbe bello

public interface ProductRepository 
    extends CrudRepository<Product, Long> { 

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

Ma questo non funziona. C'è una soluzione che creo un'implementazione dell'interfaccia (http://stackoverflow.com/questions/3479128/jpql-limit-number-of-results) Ma mi chiedo se non ci sia la possibilità di aggiungere offset e limite alla domanda o se c'è un'annotazione per questo.

+0

Perché non si implementa semplicemente il metodo e si utilizza l'API JPA? Le annotazioni sono interessanti, ma non dovrebbero sostituire tutto il codice Java. –

+1

È il modo standard per utilizzare ed estendere le interfacce del repository di Spring. –

+2

Scrivendo questo ... il modo standard per risolvere il problema fondamentale è usare 'PagingAndSortingRepository'. –

risposta

5

limit non è supportato da JPQL. Anche senza di esso le tue domande non sono valide JPQL queries (ma potrebbero essere HQL validi e potrebbero funzionare se il tuo provider JPA è tollerante).

Un'implementazione (parziale) è necessaria in modo da poter utilizzare l'interfaccia Query o l'API dei criteri.

9

+1 a ciò che l'utente "suo", ha detto nel commento:

"il modo standard per risolvere il problema fondamentale è quello di utilizzare PagingAndSortingRepository"

Ecco un esempio. Sto buttando in ordinamento proprio come un ulteriore bonus:

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

(È possibile utilizzare @query sopra, se volete, ma JPQL sé non supportano limiti, come la "sua", ha osservato.)

poi quando si chiama, utilizzare

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

ho scritto vari post del blog su questo argomento, che può rivelarsi utile:

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