2015-05-03 6 views
13

consideri un repository di dati Primavera Jpa:Come abbreviare i nomi dei metodi di query nei repository JPA di Spring Data?

public interface UserRepository extends JpaRepository<User, Long> { 

    User findOneByDeletedIsFalseAndActivationKey(String activationKey); 

    List<User> findAllByDeletedIsFalseAndActivatedIsFalseAndCreatedDateBefore(DateTime dateTime); 

    User findOneByDeletedIsFalseAndLogin(String login); 

    User findOneByDeletedIsFalseAndEmail(String email); 

} 

Avviso ogni metodo ha "DeletedIsFalse" in esso. C'è un modo semplice per rendere più brevi i nomi dei metodi? Come ad esempio

@FullMethodName("findOneByDeletedIsFalseAndEmail") 
User findOneByEmail(String email); 
+0

Esiste una soluzione migliore per questo problema nell'attuale versione di SDR? –

risposta

6

Non esiste un modo. È possibile specificare qualsiasi nome per un metodo e aggiungere un'annotazione @Query con valore di parametro che detiene query desiderata a base di dati in questo modo:

@Query(value="select u from User u where u.deleted=false and u.email=:email") 
User findOneByEmail(@Param("email")String email); 

o, con query SQL nativo:

@Query(value="SELECT * FROM users WHERE deleted=false AND email=?1", nativeQuery=true) 
User findOneByEmail(String email); 

È inoltre possibile utilizzare i nomi che seguono la convenzione di denominazione per le query dall'annotazione @Query avranno la precedenza sulla query dal nome del metodo.

@Query docs

Upd:

dalla primavera docs:

Anche se ottenere una query derivato dal nome del metodo è molto conveniente, si potrebbe affrontare la situazione in cui il metodo ... il nome diventerebbe inutilmente brutto. Quindi puoi utilizzare le query con nome JPA attraverso una convenzione di denominazione ... o piuttosto annotare il tuo metodo di query con @Query.

16

Usa default funzione Java 8 per il confezionamento, proprio in questo modo:

// use findOneByEmail instead 
User findOneByDeletedIsFalseAndEmail(String email); 

default User findOneByEmail(String email) { 
    return findOneByDeletedIsFalseAndEmail(email); 
} 

Vedi an example.

+0

Devo abilitare qualcosa affinché funzioni? Non lo trova nemmeno in 'cerca' per me. – Shadov

+0

@Shadov, cosa intendi per abilitazione? tutto ciò di cui hai bisogno è java 8, che include funzionalità di funzionalità di parole chiave predefinite: 'default returnType shortMethodName (args) {return longMethoName (args); } ' –

+0

Sì, ma per qualche motivo non funziona, non ho idea del perché, è come se i miei metodi predefiniti non esistessero. Ho pensato che forse ho bisogno di abilitare qualcosa. – Shadov