是否可以编写一个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?
答案 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”的数组及其各自的计数。