2015-05-03 4 views
13

Betrachten wir ein Spring Data JPA Repository:Wie verkürzen Namen von Abfragemethoden in Spring Data JPA-Repositories?

public interface UserRepository extends JpaRepository<User, Long> { 

    User findOneByDeletedIsFalseAndActivationKey(String activationKey); 

    List<User> findAllByDeletedIsFalseAndActivatedIsFalseAndCreatedDateBefore(DateTime dateTime); 

    User findOneByDeletedIsFalseAndLogin(String login); 

    User findOneByDeletedIsFalseAndEmail(String email); 

} 

Hinweis jede Methode "DeletedIsFalse" in sich hat. Gibt es eine einfache Möglichkeit, Methodennamen kürzer zu machen? Ähnlich wie:

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

Gibt es eine bessere Lösung für dieses Problem in der aktuellen SDR-Version? –

Antwort

6

Es gibt keinen solchen Weg. Sie können einen beliebigen Namen für eine Methode angeben und eine Anmerkung @Query mit Parameterwert hinzufügen, die wie diese gewünschte Abfrage Datenbank enthält:

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

oder mit nativen SQL-Abfrage:

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

Sie auch verwenden können Namen, die der Namenskonvention für Abfragen folgen, da die Annotation @Query Vorrang vor der Abfrage von Methodenname hat.

@Query docs

Upd:

von Spring docs:

Obwohl eine Abfrage aus dem Methodennamen abgeleitet immer sehr bequem ist, so könnte man die Situation konfrontiert, in denen ... das Verfahren Name würde unnötig hässlich werden. Sie können also Abfragen mit JPA-Namen entweder über eine Namenskonvention verwenden oder die Abfragemethode mit @Query annotieren.

16

Verwenden default Java 8 Feature für die Verpackung, wie so:

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

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

an example See.

+0

Soll ich etwas aktivieren, damit das funktioniert? Findet es nicht einmal in "suchen" für mich. – Shadov

+0

@Shadov, was meinst du mit aktivieren? Alles, was Sie brauchen, ist Java 8, das die standardmäßige Schlüsselwortfunktionalität enthält: 'default returnType shortMethodName (args) {return longMethoName (args); } ' –

+0

Ja, aber es funktioniert nicht für mich aus irgendeinem Grund, keine Ahnung, warum, es ist wie meine Standardmethoden nicht da sind. Vielleicht muss ich etwas aktivieren. – Shadov

Verwandte Themen