【问题标题】:HQL order by type()HQL 按 type() 排序
【发布时间】:2013-02-18 12:38:42
【问题描述】:

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

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

select e from MyEntityParent e
order by type(e)

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

【问题讨论】:

  • 我认为你做不到。您可以通过按自然顺序设置它们的类型标识符来“破解”它,例如“A”将出现在“Z”之前。
  • 不幸的是,我无法更改类型的“自然顺序”,休眠映射是在运行时自动生成的。我无法更改该工具的生成过程...

标签: java hibernate hql


【解决方案1】:

试试

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 中已被弃用

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

【讨论】:

  • 是的,'order by type(e)' 似乎与 'order by e.class' 相同,这就是我所说的“内部整数值”==“鉴别器值”。
  • 嗯,我在徘徊内部整数值可能是什么;)
【解决方案2】:

没有直接的解决方案,因为 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 提供程序。

【讨论】:

    猜你喜欢
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 2014-09-30
    • 1970-01-01
    相关资源
    最近更新 更多