HQL命令类型()

时间:2013-02-18 12:38:43

标签: java hibernate hql

例如,我有一个名为'MyEntityParent'的基本实体和两个子类型'ZChild'和'AChild'。

使用以下HQL时,这将按类型的内部整数值(与特殊类属性相同)对结果列表进行排序:

select e from MyEntityParent e
order by type(e)

但是,我需要按实体类型的名称对结果列表进行排序。即,首先,类型为“AChild”的实例,然后是“ZChild”类型的实例。

2 个答案:

答案 0 :(得分:0)

尝试

select e from MyEntityParent e order by e.class

来自Hibernate 3.6文档:

  

特殊属性类在多态持久性的情况下访问实例的鉴别器值。嵌入在where子句中的Java类名将被转换为其鉴别器值。

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/queryhql.html#queryhql-where

但这在Hibernate 4.1中已被弃用

这也不是你想要的,因为如果我正确阅读文档,它会返回鉴别器值,而不是确切的类型名称。

答案 1 :(得分:0)

没有直接的解决方案,因为HQL被转换为SQL并且数据库不知道值如何映射到类的名称。有办法实现它,但它并不好:

  • 查询变得复杂,因为我们必须在查询中定义顺序。
  • 选择列表包含定义顺序的附加值,因此我们无法返回实体列表。
  • 当模型更改时,应修改查询

查询是:

SELECT e,
  CASE TYPE(e) WHEN AChild THEN 1
               WHEN ZChild THEN 2
               ELSE 3 
  END AS orderValue
FROM MyEntityParent e ORDER BY orderValue 

如上所述,结果不再是实体列表,它是对象数组的列表,因此访问实体有点困难。实体本身是数组中的第一项(索引0),第二项是ordedValue:

 List<Object[]> result = em.createQuery("JPQL given above").getResultList();
 for (Object[] resultRow : result) {
     MyEntityParent myEntityParent = (MyEntityParent) resultRow[0];
 }

解决方案是有效的JPQL,因此它不是特定于Hibernate的,但也适用于其他JPA提供程序。