【发布时间】:2011-01-10 19:28:51
【问题描述】:
我有一个父实体和子实体之间的一对多映射。现在我需要找到与每个父母相关联的孩子的数量,以获得父母的名单。我正在尝试使用 HQL 执行此操作,但我不确定如何获取其中的父母名单。另外,我不知道如何返回实体本身而不仅仅是它的 ID。我当前的 HQL 查询是:
select new map(parent.id as parentId, count(*) as childCount)
from Parent parent left join parent.children children
group by parent.id
但这只会返回 ID,不会过滤特定的父母。
编辑 根据 Pascal 的回答,我已将查询修改为
select new map(parent as parent, count(elements(parent.children)) as childCount)
from Parent parent
group by parent
这确实有效,但速度非常慢:在同一个数据库上是 30 秒而不是 400 毫秒。
【问题讨论】:
-
确实,这太慢了。实际上很难接受......
-
索引可能(强调可能)有助于提高速度,但如果可以的话,另一种选择是将 hql 查询分解为多个部分 - 我发现这有时会有所帮助。或者您可以对每个父元素进行单独查询,然后自己创建地图。一个好的数据库分析器可能有助于探索。
-
我最终选择的解决方案是首先从数据库中检索所有父母,然后运行查询,它会为我提供父母 ID 和计数,然后在 Java 中将两者合并。无论如何,我必须得到所有的父母,并且将该列表与孩子计数合并需要不到一秒钟的时间,在这种情况下是可以的。