2016-03-14 15 views
8

devo una classe di entità come segue:Come dovrei riferirmi alle enumerazioni interiori (definite all'interno di un'entità) da una query JPQL usando Hibernate?

package stuff; 

@Entity 
class Thing { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @Basic 
    @Enumerated 
    private State state; 

    public enum State { 
     AWESOME, 
     LAME 
    } 
} 

Come posso selezionare tutte le cose con lo stato IMPRESSIONANTE utilizzando JPQL e Hibernate?

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

... dà l'errore ...

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

risposta

10

utilizzare la seguente forma:

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

Type$InnerType è convenzione di denominazione di Java per i tipi di interni.

Quando si tenta di utilizzare la notazione dei punti, Hibernate presuppone che si stia tentando di accedere alle proprietà nidificate, che (correttamente) non riesce in questo caso.

+2

utilizzare meglio ancora un parametro, e superare un valore enum nel come valore del parametro ... e la query è riutilizzabile per altri valori dei parametri –

+0

@NeilStockton: alcune query più complesse potrebbero aver senso solo nel contesto di uno stato particolare Hai ragione che in casi semplici come l'esempio, l'utilizzo di un parametro potrebbe essere più flessibile. La domanda era limitata alla sintassi;) –

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

Funziona, ma interrompe il controllo e il refactoring del tipo per IDE compatibili con JPA come IntelliJ. Meglio usare il tipo piuttosto che una rappresentazione di stringa, penso. –

Problemi correlati