例如,我有一个名为'MyEntityParent'的基本实体和两个子类型'ZChild'和'AChild'。
使用以下HQL时,这将按类型的内部整数值(与特殊类属性相同)对结果列表进行排序:
select e from MyEntityParent e
order by type(e)
但是,我需要按实体类型的名称对结果列表进行排序。即,首先,类型为“AChild”的实例,然后是“ZChild”类型的实例。
答案 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提供程序。