2016-03-14 17 views
8

Ich habe eine Entity-Klasse wie folgt:Wie soll ich auf innere Enums (definiert in einer Entität) aus einer JPQL-Abfrage mit Hibernate?

package stuff; 

@Entity 
class Thing { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @Basic 
    @Enumerated 
    private State state; 

    public enum State { 
     AWESOME, 
     LAME 
    } 
} 

Wie kann ich alle Dinge auswählen, mit Zustand mit JPQL FANTASTISCHEN und Ruhezustand?

select t from Thing t where t.state=stuff.Thing.State.AWESOME 

... gibt den Fehler ...

org.hibernate.hql.internal.ast.QuerySyntaxException: Invalid path: 'stuff.Thing.State.AWESOME' 

Antwort

10

Verwenden Sie das folgende Idiom:

select t from Thing t where t.state=stuff.Thing$State.AWESOME 

Type$InnerType ist für innere Typen Java Namenskonvention.

Wenn Sie versuchen, Punktnotation zu verwenden, geht Hibernate davon aus, dass Sie versuchen, auf geschachtelte Eigenschaften zuzugreifen, was in diesem Fall (ordnungsgemäß) fehlschlägt.

+2

besser noch einen Parameter verwenden, und einen Enum-Wert in als Parameterwert übergeben ... und die Abfrage ist wiederverwendbar für andere Parameterwerte –

+0

@NeilStockton: Einige komplexere Abfragen könnten nur dann sinnvoll im Kontext machen von ein bestimmter Staat. Sie haben recht, dass in einfachen Fällen wie dem Beispiel die Verwendung eines Parameters flexibler sein kann. Die Frage war auf die Syntax beschränkt;) –

0
select t from Thing t where t.state='AWESOME' 
+0

Das funktioniert, aber bricht Typprüfung und Refactoring für JPA-fähige IDEs wie IntelliJ. Es ist besser, den Typ als eine String-Darstellung zu verwenden, denke ich. –