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

sfu*_*ger 4 java hibernate

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

"select discriminator d, count(*) c from Foo group by discriminator"
Run Code Online (Sandbox Code Playgroud)

像一个映射

<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>
Run Code Online (Sandbox Code Playgroud)

和一个可能的结果

+-----+---+
| d   | c |
+-----+---+
| BAR | 3 |
| BAZ | 4 |
+-----+---|
Run Code Online (Sandbox Code Playgroud)

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

Gui*_*ume 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
Run Code Online (Sandbox Code Playgroud)

这将返回包含"BAR"和"BAZ"的数组及其各自的计数.