Java 通过HQL获取儿童计数

Java 通过HQL获取儿童计数,java,hibernate,orm,hql,Java,Hibernate,Orm,Hql,我在父实体和子实体之间有一对多映射。现在,我需要为父母列表找到与每个父母相关联的孩子的数量。我正试图用HQL来做这件事,但我不确定如何才能得到那里的家长名单。此外,我不知道如何返回实体本身,而不仅仅是它的ID。我当前的HQL查询是: select new map(parent.id as parentId, count(*) as childCount) from Parent parent left join parent.children children group by parent.

我在父实体和子实体之间有一对多映射。现在,我需要为父母列表找到与每个父母相关联的孩子的数量。我正试图用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毫秒。

我不是100%确定,但这是怎么回事:

select new map(parent.id, count(elements(parent.children)))
from Parent parent group by parent.id

多谢各位。我在寻找某位家长的子女数量,你的帖子让我朝着正确的方向前进

如果其他任何人需要查找特定家长的子女数量,您可以使用以下方法:

Query query = this.sessionFactory.getCurrentSession().createQuery("select count(elements(parent.children)) from Parent parent where name = :name");
query.setString("name", parentName);
System.out.println("count = " + query.uniqueResult());

这样做不起作用,我会遇到一个SQL异常,因为生成的SQL组是按parent.id生成的,但也会选择许多其他列。事实上,这非常慢。实际上,这几乎是不可接受的…索引可能(重点是may)有助于提高速度,但如果可以的话,另一种选择是将hql查询分解为多个部分-我发现这有时会有所帮助。或者,您可以对每个父元素进行单独的查询,然后自己创建映射。一个好的数据库探查器可能会有助于进行探索。我最终选择的解决方案是首先从数据库中检索所有父项,然后运行查询,该查询将提供父项ID和计数,然后在Java中将两者合并。无论如何,我必须得到所有的父母,并且将该列表与孩子数合并需要不到一秒钟的时间,这在这种情况下是可以的。