Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HQL按类型排序()_Java_Hibernate_Hql - Fatal编程技术网

Java HQL按类型排序()

Java HQL按类型排序(),java,hibernate,hql,Java,Hibernate,Hql,例如,我有一个名为“MyEntityParent”的基本实体和两个子类型“ZChild”和“AChild” 使用以下HQL时,将按类型的内部整数值(与特殊类属性相同)对结果列表进行排序: 但是,我需要按其实体类型的名称对结果列表进行排序。也就是说,首先是“AChild”类型的实例,然后是“ZChild”类型的实例。试试看 select e from MyEntityParent e order by e.class 从Hibernate 3.6文档中: 在多态持久性的情况下,特殊属性类访问实例

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

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

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

试试看

select e from MyEntityParent e order by e.class
从Hibernate 3.6文档中:

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

但在Hibernate4.1中,这是不推荐的


此外,这也不是您希望的,因为它返回的是鉴别器值,如果我正确阅读文档,则不是确切的类型名称。

没有简单的解决方案,因为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];
 }
List result=em.createQuery(“上面给出的JPQL”).getResultList();
对于(对象[]resultRow:result){
MyEntityParent MyEntityParent=(MyEntityParent)resultRow[0];
}

解决方案是有效的JPQL,因此它不是特定于Hibernate的,但也可以与其他JPA提供商一起使用。

我认为您无法做到这一点。您可以通过按自然顺序设置它们的类型标识符来“破解”它,比如“A”将出现在“Z”之前。不幸的是,我无法更改类型的“自然顺序”,hibernate映射是在运行时自动生成的。我无法更改该工具的生成过程…是的,“按类型(e)排序”似乎与“按e.class排序”相同,这就是我所说的“内部整数值”==“鉴别器值”。嗯,我在想内部整数值可能是什么;)
 List<Object[]> result = em.createQuery("JPQL given above").getResultList();
 for (Object[] resultRow : result) {
     MyEntityParent myEntityParent = (MyEntityParent) resultRow[0];
 }