按照每个类层次结构映射的表中的鉴别器值进行分组

时间:2010-06-25 14:03:51

标签: java hibernate

是否可以编写一个HQL查询,该查询根据每个类层次结构映射的表的鉴别值对结果进行分组?例如

"select discriminator d, count(*) c from Foo group by discriminator"

带有像

这样的映射
<hibernate-mapping>
  <class abstract="true" name="Foo">
    <!-- SNIP -->
    <subclass name="Bar" discriminator-value="BAR">
      <!-- SNIP -->
    </subclass>
    <subclass name="Baz" discriminator-value="BAZ">
      <!-- SNIP -->
    </subclass>
  </class>
</hibernate-mapping>

和可能的结果如

+-----+---+
| d   | c |
+-----+---+
| BAR | 3 |
| BAZ | 4 |
+-----+---|

所以我正在寻找的是我的HQL查询中discriminator的有效替换。有什么东西还是我必须去原始SQL?

1 个答案:

答案 0 :(得分:6)

class属性执行此操作:来自Hibernate doc

  

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

     来自Cat cat的

cat.class = DomesticCat

显然,在使用class属性时,有必要使用别名来引用你的实体,至少在我正在使用的Hibernate版本中。 所以你的HQL请求应该是:

select f.class, count(*) c from Foo f group by f.class

这将返回包含“BAR”和“BAZ”的数组及其各自的计数。