如何在HQL中访问枚举属性?

时间:2011-02-04 02:18:50

标签: java hibernate enums hql

我有一个这样的枚举:

TicketPriority {

LOW(4),
NORMAL(3),
HIGH(2),
IMMEDIATE(1);

private Integer index;

TicketPriority (Integer index){
    this.index = index;
}

public Integer getIndex(){
    return this.index;
}

public void setIndex(Integer index){
    this.index = index;
}
}

...我有一个具有优先权的Ticket实体。问题是:我需要按优先顺序排序我的结果,所以我认为这样可行,但事实并非如此:

select t from Ticket t order by t.priority.index

我从Hibernate收到错误。除了创建优先级作为实体之外,还有什么想法吗?

感谢您的任何建议! :)

1 个答案:

答案 0 :(得分:1)

你不能这样做。

HQL查询转换为SQL执行,因此HQL查询中引用的所有属性都应存储在数据库中。由于您的index属性未存储在数据库中,因此无法将带有它的HQL查询转换为SQL查询。

您只能在HQL查询的ORDER BY子句中使用枚举,以按其数据库表示的自然顺序(即名称或序号)进行排序。

您有几种选择:

  1. 组织您的enum以使其声明的顺序与其index es的所需顺序相匹配,并将Hibernate配置为将它们作为序数存储在数据库中。如果已经配置,在您的情况下,所需的查询将是

    select t from Ticket t order by t.priority desc
    
  2. 使用@Embeddable / <component>类代替enumindex存储在数据库中。

  3. 编写自定义类型以将您的枚举表示为index