【问题标题】:How can I access enum atributes in HQL?如何访问 HQL 中的枚举属性?
【发布时间】:2011-02-04 02:18:49
【问题描述】:

我有一个这样的枚举:

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 收到一个错误。除了将 Priority 作为一个实体创建之外还有什么想法吗?

感谢您的任何建议! :)

【问题讨论】:

  • 我很困惑...如果您的 Ticket 是一个实体并且它包含一个 Priority,那么这不会使 Priority 也成为一个实体,以便它首先在 Hibernate 中工作吗?
  • 你不能发布错误或堆栈跟踪吗?这只是在黑暗中拍摄,没有更多细节。
  • 我稍后会发布错误,但基本上 hibernate 告诉我我的索引 var 不存在。 :(

标签: java hibernate enums hql


【解决方案1】:

你不能这样做。

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

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

您有多种选择:

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

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

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

【讨论】:

  • 谢谢哥们!我会尝试第一个。我不知道有可能做到这一点。看来我必须使用 @Enumerated(EnumType.ORDINAL) 注释。谢谢,再来一次!
猜你喜欢
  • 2014-06-01
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 2021-11-13
  • 1970-01-01
  • 2011-02-16
相关资源
最近更新 更多