setMaxResults per l’annotazione Spring-Data-JPA?

Sto cercando di incorporare Spring-Data-JPA al mio progetto. Una cosa che mi confonde è come ottenere setMaxResults (n) per annotazione?

ad esempio, il mio codice:

public interface UserRepository extends CrudRepository { @Query(value="From User u where u.otherObj = ?1 ") public User findByOhterObj(OtherObj otherObj); } 

Ho solo bisogno di restituire one (and only one) utente da otherObj, ma non riesco a trovare un modo per annotare i maxResults … Qualcuno può darmi un suggerimento?

(mysql si lamenta:

 [email protected]: select user0_.id as id100_, user0_.created as created100_ from User user0_ where user0_.id=2 limit ** NOT SPECIFIED ** WARN util.JDBCExceptionReporter - SQL Error: 0, SQLState: 07001 ERROR util.JDBCExceptionReporter - No value specified for parameter 2 

)

Ho trovato un link: https://jira.springsource.org/browse/DATAJPA-147 , ho provato ma non ci sono riuscito. Non sembra ansible ora? Perché una funzione così importante non è stata creata in Spring-Data?

Se implemento questa funzione manualmente:

 public class UserRepositoryImpl implements UserRepository 

Devo implementare tonnellate di metodi predefiniti in CrudRepository , questo sarà terribile.

ambienti: spring-3.1, spring-data-jpa-1.0.3.RELEASE.jar, spring-data-commons-core-1.1.0.RELEASE.jar

A partire da Spring Data JPA 1.7.0 (Evans release train).

… puoi utilizzare le nuove parole chiave Top e First che consentono di definire metodi di query come questi:

 findTop10ByLastnameOrderByFirstnameAsc(String lastname); 

Spring Data limiterà automaticamente i risultati al numero che hai definito (predefinito a 1 se omesso). Si noti che l’ordine dei risultati diventa rilevante qui (tramite una clausola OrderBy come nell’esempio o passando un parametro Sort nel metodo). Maggiori informazioni su questo nel post del blog che riguardano le nuove funzionalità del treno di rilascio Spring Data Evans o nella documentazione .

Per le versioni precedenti

Per recuperare solo porzioni di dati, Spring Data utilizza l’astrazione di impaginazione fornita con un’interfaccia Pageable sul lato richiedente e un’astrazione di Page sul lato risultato delle cose. Quindi potresti iniziare con

 public interface UserRepository extends Repository { List findByUsername(String username, Pageable pageable); } 

e usalo in questo modo:

 Pageable topTen = new PageRequest(0, 10); List result = repository.findByUsername("Matthews", topTen); 

Se hai bisogno di conoscere il contesto del risultato (quale pagina è in realtà? È il primo? Quanti ci sono in totale?) Usa Page come tipo di ritorno:

 public interface UserRepository extends Repository { Page findByUsername(String username, Pageable pageable); } 

Il codice cliente può quindi fare qualcosa del genere:

 Pageable topTen = new PageRequest(0, 10); Page result = repository.findByUsername("Matthews", topTen); Assert.assertThat(result.isFirstPage(), is(true)); 

Non che innescare una proiezione di conteggio della query effettiva da eseguire nel caso in cui si usi Page come tipo di ritorno in quanto è necessario scoprire quanti elementi ci sono in totale per calcolare i metadati. Oltre a ciò, assicurati di equipaggiare il PageRequest con le informazioni di ordinamento per ottenere risultati stabili. Altrimenti potresti triggersre la query due volte e ottenere risultati diversi anche senza che i dati siano stati modificati in basso.

Se si utilizza Java 8 e Spring Data 1.7.0, è ansible utilizzare i metodi predefiniti se si desidera combinare un’annotazione @Query con l’impostazione dei risultati massimi:

 public interface UserRepository extends PagingAndSortingRepository { @Query("from User u where ...") List findAllUsersWhereFoo(@Param("foo") Foo foo, Pageable pageable); default List findTop10UsersWhereFoo(Foo foo) { return findAllUsersWhereFoo(foo, new PageRequest(0,10)); } } 

Esiste un modo per fornire l’equivalente di “un setMaxResults (n) per annotazione” come nell’esempio seguente:

 public interface ISomething extends JpaRepository { @Query("FROM XYZ a WHERE a.eventDateTime < :before ORDER BY a.eventDateTime DESC") List findXYZRecords(@Param("before") Date before, Pageable pageable); } 

Questo dovrebbe fare il trucco, quando un paginabile viene inviato come parametro. Ad esempio per recuperare i primi 10 record che è necessario impostare pageable a questo valore:

 new PageRequest(0, 10) 

Usa Spring Data Evans (1.7.0 RELEASE)

la nuova release di Spring Data JPA con un altro elenco di moduli insieme chiamato Evans ha la caratteristica di utilizzare le parole chiave Top20 e First per limitare il risultato della query,

così ora potresti scrivere

 List findTop20ByLastname(String lastname, Sort sort); 

o

 List findTop20ByLastnameOrderByIdDesc(String lastname); 

o per un singolo risultato

 List findFirstByLastnameOrderByIdDesc(String lastname); 

La scelta migliore per me è la query nativa:

 @Query(value="SELECT * FROM users WHERE other_obj = ?1 LIMIT 1", nativeQuery = true) User findByOhterObj(OtherObj otherObj); 

È anche ansible utilizzare @QueryHints. Esempio muggito utilizza org.eclipse.persistence.config.QueryHints # JDBC_MAX_ROWS

 @Query("SELECT u FROM User u WHERE .....") @QueryHints(@QueryHint(name = JDBC_MAX_ROWS, value = "1")) Voter findUser(); 

Se la tua class @Repository estende JpaRepository puoi utilizzare l’esempio seguente.

 int limited = 100; Pageable pageable = new PageRequest(0,limited); Page transactionsPage = transactionRepository.findAll(specification, pageable); return transactionsPage.getContent(); 

getContent restituisce una List .