Сначала немного контекста и объяснения:
Я написал следующий запрос HQL:
select size(childGroups), size(ipts), g.id, g.name, g.status from LogicalGroup g where g.isRoot=true group by g.id, g.name, g.status
LogicalGroup
- это сущность со скалярными полями: id, name, status, isRoot
и двумя полями для сбора сущностей:
, что является
@OneToMany(mappedBy = "parentGroup")<br>
Set<LogicalGroup>
parentGroup
- это другое поле в LogicalGroup
,(Каждая группа содержит набор дочерних групп и родительскую группу).
и
, что составляет
@OneToMany(mappedBy = "logicalGroup")<br>
Set<IPT>
каждый IPT
имеет поле logicalGroup
, обозначающее группу, к которой оно принадлежит.
Я хотел бы, чтобы запрос выполнял выбор размера коллекции childGroups
и размера коллекции ipts
, принадлежащейкорень LogicalGroup
(где isRoot
== правда).Существует только одна группа, для которой isRoot
== true.
Логическая группа и IPT наследуют свои поля id
от суперкласса AbstractEntity
.Структура таблицы такова, что для каждого класса существует одна таблица (суперкласс также имеет свою собственную таблицу).Нет таблиц соединения для отношений между родительскими / дочерними логическими группами или логической группой / IPT.
Теперь вопрос:
Во-первых, я должен сказать, что запрос возвращает скалярправильные значения.
Проблема в том, что запрос появляется , чтобы вернуть размер LogicalGroup
, установленный правильно, но, похоже, возвращает общее количество IPT
с в IPT
стол, а не только те, которые принадлежат LogicalGroup
.Куда я иду не так?Что-то не так с запросом или, возможно, с отображением коллекций?
Я включил ведение журнала SQL, и Hibernate генерирует и выполняет следующее:
Hibernate: select count(childgroup1_.parentGroup_id) as col_0_0_,
count(ipts2_.logicalGroup_id) as col_1_0_,
logicalgro0_.id as col_2_0_,
logicalgro0_.name >as col_3_0_,
logicalgro0_.status as col_4_0_ from LogicalGroup logicalgro0_
inner join AbstractEntity
logicalgro0_1_ on logicalgro0_.id=logicalgro0_1_.id,
LogicalGroup childgroup1_,
IPT ipts2_
where
logicalgro0_.id=childgroup1_.parentGroup_id and
logicalgro0_.id=ipts2_.logicalGroup_id and
logicalgro0_.isRoot=true
group by
logicalgro0_.id , logicalgro0_.name , logicalgro0_.status