2015-09-08 10 views
15

EDIT: Le soluzioni a questo problema sono forniti nel secondo e nel quarto risposta per quanto riguarda questa domanda setMaxResults for Spring-Data-JPA annotation?Recupero solo primo all'ultimo elemento/usando primavera dati JPA e @query annotazione

Obiettivo: Fetch la più grande/piccolo elemento per la proprietà z utilizzando un repository JPA di Spring Data e l'annotazione Spring Query.

Quello che ho finora

@Query("SELECT xelement FROM x xelement ORDER BY xelement.z") 
public List<X> findFirstElement(); 

Problema: Questa query recupera tutti gli elementi (che non è davvero efficace). Se Vorrei utilizzare l'EntityManager direcly, ho potuto impostare il numero di risultati utilizzando

entityManager.setMaxResults(1) 

solo ottenere il primo elemento.

Domanda: Come faccio a specificare il numero massimo di risultati che utilizzano il @ query annotazione?

Idea: utilizza una PageRichiesta di dimensioni 0 la strada da percorrere?

Vincoli: Sono consapevole della funzione di query "FindFirstBy ...." ma desidero/devo utilizzare l'annotazione @Query.

+0

Perché il metodo restituisce 'Elenco ' quando è previsto solo il ritorno di un singolo elemento? Se la query è davvero così semplice, puoi evitare di usare '@ Query' e semplicemente avere' findFirstOrderByZ() '. In caso contrario, sarà necessario utilizzare la parola chiave LIMIT per limitare il numero di record restituiti 'SELEZIONA x DA xelementi x ORDINA PER x.z LIMIT 1'. – manish

+0

@manish: 1. per quanto riguarda la lista , questo doveva essere abbastanza flessibile nel caso in cui avrei commutato un numero arbitrario di elementi, ma sì, in linea di principio sei corretto, restituire una lista è eccessivo in questo caso. 2. Riguardo a "findFirst .." -> vedere i vincoli. 3. Sei sicuro che la parola chiave limite sia disponibile in JPQL? Suppongo di doverlo controllare ... Ho anche trovato http://stackoverflow.com/questions/9314078/setmaxresults-for-spring-data-jpa-annotation che risolve praticamente il problema. –

+0

Trovato questo per essere coperto dalla seconda e quarta risposta in [http: // StackOverflow.com/domande/9314078/setmaxresults-per-primavera-dati-APP-annotazioni] [1] [1]: http://stackoverflow.com/questions/9314078/setmaxresults-for-spring-data -jpa-annotation –

risposta

0

provare a fare questo:

@Query(value = "SELECT xelement FROM x xelement ORDER BY xelement.z LIMIT 1", 
     nativeQuery = true) 
+0

Vedo che hai già annullato una modifica in cui qualcuno ha corretto il tuo inglese, ma "Prova questo" è molto meglio qui inglese di "Prova a fare questo". (Sono un madrelingua inglese britannico.) Il tuo fraseggio suona come se tu fossi molto insicuro della forma corretta - nel qual caso questo non dovrebbe essere un commento ma una risposta. –

+1

Penso che questo non sia un sito per il controllo della grammatica inglese .... –

4

È possibile utilizzare la proprietà limite di SQL solo con l'aggiunta di nativeQuery @query annotazione. Tuttavia, c'è un altro e un modo migliore per farlo. Classe paginabile nel metodo repository risolverà il problema senza toccare l'annotazione @query:

@Query(value = "SELECT xelement FROM x xelement ORDER BY xelement.z") 
List<X> findFirstElement(Pageable limit); 

per impostare il limite e di offset, uso dovrebbe chiamare questo metodo repository come segue:

List<X> xValues = xRepository.findFirstElement(new PageRequest(0, 1)); 

Qui 1 corrisponde al limite che vuoi

1

La sintassi di query JPA più vicina che posso pensare per il tuo caso d'uso è findFirstByZIsNotNullOrderByZAsc. Questo dovrebbe eliminare la necessità di scrivere query native personalizzate.

Problemi correlati