# JPA NamedQuery mit Enum-Wert



## sebastian_goetz (18. Aug 2011)

Hallo Java-Forum,

Ich arbeite derzeit mit JSF und JPA an einer Lösung und bin nun darauf gekommen, verschiedene Typen als enums anstatt mit einfachen Konstanten zu pflegen, was diverse Vorteile bringt.

Da ich NamedQueries einsetzte, habe ich auch dort gebrauch davon gemacht. Allerdings wirft mir der Java-Compiler bei folgendem Versuch eine Fehlermeldung an den Kopf.



> The value for annotation attribute NamedQuery.query must be a constant expression




```
@NamedQuery(name = ProjectCardParameter.QUERY_BY_PROJECT_TYPE, query = "SELECT pcp FROM ProjectCardParameter pcp WHERE (pcp.projectType = :projectType1 OR pcp.projectType = " + Constants.ProjectType.ANY + ") ORDER BY pcp.defaultVisibility ASC, pcp.name ASC"),
```

Wenn ich den Teil 

```
OR pcp.projectType = " + Constants.ProjectType.ANY
```
wegnehme, passt es, aber ich brauche diesen Teil. Mir fallen zwar einige Wege ein dies zu umschiffen, aber eigentlich würde ich gerne verstehen warum das so ist bzw. wie ich dies richtig machen kann?

Gruß

Sebastian


----------



## xerberuz (18. Aug 2011)

Der Compiler muss bei Annotation zur compilezeit den endgültigen Wert bestimmen können. Da es möglich ist die toString Methode von Constants.ProjectType.ANY zu überschreiben, kann der endgültige Wert nicht bestimmt werden.


----------



## sebastian_goetz (18. Aug 2011)

Ok,

erstmal danke für die Antwort. Verstehen tue ich es trotzdem nicht. Zur Compile-Zeit steht doch fest, wie die toString()-Methode aussieht.???:L

Wenn ich das richtig im Kopf habe. macht der Compiler aus den enum-Deklarationen doch jeweils eine Klasse mit entsprechenden Wert-Konstanten für die einzelnen enum-Werte.


> Java programming language enum types are much more powerful than their counterparts in other languages. The enum declaration defines a class (called an enum type). The enum class body can include methods and other fields. The compiler automatically adds some special methods when it creates an enum. For example, they have a static values method that returns an array containing all of the values of the enum in the order they are declared.


----------



## xerberuz (19. Aug 2011)

Es steht fest wie die toString methode aussieht. Es ist aber erst zur Laufzeit klar welches Ergebnis sie liefert.


----------



## sebastian_goetz (19. Aug 2011)

Ok,

jetzt hab ich es kapiert. :idea:
Das heißt aber auch, dass es mit enum nicht funktionieren kann.

Gruß

Sebastian


----------

