Группировка по значению дискриминатора в таблице для сопоставления иерархии классов - PullRequest
4 голосов
/ 25 июня 2010

Можно ли написать 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 |
+-----+---|

Итак, я ищу правильную замену discriminator в моем HQL-запросе. Есть ли такая вещь или мне нужно перейти на сырой SQL?

1 Ответ

6 голосов
/ 25 июня 2010

Атрибут class делает это: из документа Hibernate

Класс специальных свойств обращается к значению дискриминатора экземпляра в случае полиморфной персистентности. Имя класса Java, встроенное в предложение where, будет преобразовано в его значение дискриминатора.

от Cat cat, где cat.class = DomesticCat

Очевидно, что при использовании атрибута класса необходимо использовать псевдонимы для ссылки на ваши сущности, по крайней мере в той версии Hibernate, которую я использую. Итак, ваш HQL-запрос должен быть:

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

И это вернет массивы, содержащие «BAR» и «BAZ» вместе с их соответствующими значениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...