【问题标题】:Get children count via HQL通过 HQL 获取儿童数量
【发布时间】: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 中将两者合并。无论如何,我必须得到所有的父母,并且将该列表与孩子计数合并需要不到一秒钟的时间,在这种情况下是可以的。

标签: java hibernate orm hql


【解决方案1】:

我不是 100% 确定,但是这个呢:

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

【讨论】:

  • 不起作用,执行此操作时出现 SQL 异常,因为生成的 SQL 按 parent.id 分组,但也选择了许多其他列。
【解决方案2】:

谢谢。我正在寻找特定父母的孩子人数,而您的帖子让我朝着正确的方向前进。

如果其他人需要查找特定父母的子女数量,您可以使用以下内容:

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());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多