2013-08-23 12 views
13

Ich möchte keine konstanten Werte fest codieren, sondern würde sie lieber durch eine Referenzvariable spezifizieren.Gibt es eine Möglichkeit, Konstanten in Spring Data @Query-Annotationswert zu verwenden?

Zum Beispiel das Schreiben eher dann die nächste Abfrage:

@Query(value = "SELECT u FROM UserModel u WHERE u.status = 1") 

..ich möchte den Wert fest codierten extrahieren ‚1‘ und schreiben so etwas wie:

@Query(value = "SELECT u FROM UserModel u WHERE u.status = UserModel.STATUS_ACTIVE") //doesn't compile 

Gibt es eine Möglichkeit Konstanten wie im zweiten Beispiel innerhalb von Sprungdatenabfragen zu spezifizieren?

Antwort

5

Ich würde empfehlen, eine Enum und ein Feld dieser Enumeration auf der Entität zu erstellen.

public enum UserModelStatus{ 
    ACTIVE, INACTIVE 
} 

public UserModel{ 

    /* Other fields ommitted */ 

    @Enumerated(EnumType.STRING) 
    private UserModelStatus status; 

    /* Get/Set Method */ 
} 

Dann Repository-Methode erstellen:

@Repository 
public interface UserModelRepository extends JpaRepository<UserModel, Long>{ 

    public List<UserModel> findByStatus(UserModelStatus status); 

} 

Mit Spring Data Sie werden nicht einmal brauchen JPQL schreiben Sie einfach die Methode aufrufen, wie:

@Autowired 
    UserModelRepository userModelRepository; 

    public void someMethod(){ 
     List<UserModel> userModels = userModelRepository.findByStatus(UserModelStatus.ACTIVE); 
    } 
+1

Wie Kann ich den findByStatus (Status UserModelStatus) einfach negieren? Ich meine alle UserModel wo UserModelStatus ist ** nicht ** Status? – stratosgear

+1

findByStatusNot (Status UserModelStatus) –

+0

Dies zeigt die volle Leistung der Federdaten. Bleiben Sie bei einfachen Abfragen dabei, es ist nicht nötig, sql selbst zu schreiben. – membersound

1

Wenn Sie verwenden möchten, Konstanten direkt in Ihrer @ Query Annotation können Sie etwas wie schreiben:

@Query("SELECT u FROM UserModel u WHERE u.status = " + UserModel.STATUS_ACTIVE) 
+9

Dies würde einen Fehler zurückgeben, der besagt, dass der Attributwert konstant sein muss. – Cleankod

+0

Das habe ich gesagt. In dieser Antwort werden Konstanten in der @Query-Annotation verwendet. – h3nrik

+1

Ja aber CONSTANT + CONSTANT ist nicht mehr konstant :) Daher der Fehler. – Cleankod

13

Sie haben vollständig qualifizierten Klassennamen wie folgt verwenden:

@Query("SELECT u FROM UserModel u WHERE u.status = com.example.package.UserModel.STATUS_ACTIVE") 

Das Schlimme an, obwohl es ist, dass ein IDE dies nicht erkennen als Nutzung der Klasse UserModel würde. Der einzige Vorteil ist, dass Sie den Wert an einem Ort behalten können, was die meiste Zeit ausreicht.

+1

das löst eine Ausnahme aus, dass 'com nicht definiert' .. Zumindest für meine – bert

+0

Haben Sie den voll qualifizierten Paketnamen für Ihren Zweck angewendet? Ich meine, Sie müssen auf die korrekte, existierende Klasse mit ihrem voll qualifizierten Namen verweisen. – Cleankod

+0

Ja, tat ich. Ich habe das Problem gelöst, indem ich die Enum-Werte übergeben habe, um sie zu vergleichen. nicht elegant, aber funktioniert – bert

0

Die Antwort darauf scheint für eine Standardlösung "Nein" zu sein.

Einige JPA-Implementierungen haben zwar eigene Lösungen, aber der Winterschlaf scheint keine der Methoden zu unterstützen, die von anderen Antworten hier vorgeschlagen werden.

2

Verwenden Sie wie folgt vor:

In der Repository-Schnittstelle, eine Konstante wie folgt definieren:

public static final String USER_QUERY = "SELECT u FROM UserModel u WHERE u.status = " + UserModel.STATUS_ACTIVE; 

Jetzt können Sie verwenden

@Query(value=USER_QUERY) 
0

Ich habe es geschafft, Klasse String-Konstante zu verwenden, in der Abfrage über den Operator SPEL T(), mit dem Sie auf statische Methoden und Konstanten einer gegebenen Klasse zugreifen können. Für String muss der Ausdruck in einfache Anführungszeichen (') eingeschlossen werden, wahrscheinlich wird er auch für Sie benötigt (wenn QuerySyntaxException auftritt).

so etwas wie dies versuchen,

@Query("SELECT u FROM #{#entityName} u " + 
     "WHERE u.status = #{T(fully.qualified.path.UserModel).STATUS_ACTIVE}") 

Hinweis: irgendwie funktioniert es nicht, wenn Sie UserModel statt # {# entityName} verwenden.

In docs seine kurz erwähnt finden Sie unter: https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#expressions-beandef-xml-based

Sie da nicht, wenn diese unterstützt wird, ich habe Feder-data-JPA 1.4.3, feder Rahmen 3.2.17