我应该如何使用Hibernate从JPQL查询中引用内部枚举(在实体中定义)?

Gab*_*man 12 java enums hibernate jpa jpql

我有一个实体类如下:

package stuff;

@Entity
class Thing {

    @Id
    @GeneratedValue 
    private Long id;

    @Basic
    @Enumerated
    private State state;

    public enum State {
        AWESOME,
        LAME
    }
}
Run Code Online (Sandbox Code Playgroud)

如何使用JPQL和Hibernate选择状态为AWESOME的所有东西?

select t from Thing t where t.state=stuff.Thing.State.AWESOME
Run Code Online (Sandbox Code Playgroud)

......给出错误......

org.hibernate.hql.internal.ast.QuerySyntaxException: Invalid path: 'stuff.Thing.State.AWESOME'
Run Code Online (Sandbox Code Playgroud)

Gab*_*man 14

使用以下习语:

select t from Thing t where t.state=stuff.Thing$State.AWESOME
Run Code Online (Sandbox Code Playgroud)

Type$InnerType 是Java的内部类型的命名约定.

当您尝试使用点表示法时,Hibernate假定您正在尝试访问嵌套属性,在这种情况下(正确)失败.

  • 更好的是仍然使用参数,并将枚举值作为参数值传递...并且查询可以重用于其他参数值 (2认同)
  • 这有记录在某处吗?我花了几个小时才发现 JPQL/Hibernate 期望内部/嵌套类有一个美元符号。顺便说一句,如果您的*实体*恰好是内部类,您可以执行“select e from DataEntity$NestedSubClassEntity e” (2认同)