【问题标题】:Grouping in hibernate在休眠中分组
【发布时间】:2023-03-23 16:09:01
【问题描述】:

我正在将旧的“经典 ASP”应用程序迁移到 J2EE/Hibernate。 我对以下类型的 SQL 语句有疑问:

SELECT parent.id, parent.name, parent.column1, count(child.id) AS no_of_children
FROM parent
INNER JOIN child ON child.parent_id = parent.id
GROUP BY parent.id, parent.name, parent.column1

如何在 HQL 中表达这样的内容?我尝试将孩子映射为一个集合(通过使用多对一)并从集合大小中获取孩子的数量,但是 Hibernate 必须分别为每个父母加载所有“孩子”实体。

这会导致执行大约 1000 个数据库查询而不是 1 个,从而导致性能问题。

有没有办法解决这个问题?

【问题讨论】:

    标签: hibernate hql


    【解决方案1】:

    我会尝试以下方法:

    select parent.id, parent.name, parent.column1, count(child) 
    from Parent parent 
    join parent.Children as child 
    group by parent.id, parent.name, parent.column1
    

    【讨论】:

    • 我不完全确定,但我认为 join 可以/应该明确写成:“left join fetch parent.Children”,以便告诉 Hibernate 通过 join 预加载集合。跨度>
    【解决方案2】:

    翻译成 HQL

    FROM Parent GROUP BY Parent.id, Parent.name, Parent.column1
    

    其中 Parent 是先前建模的实体。 join 子句在模型中定义。

    至于获取子节点的数量,对于每个父节点,请尝试删除子模型中的任何 Lob 字段,因为它们会限制您的应用程序速度。

    希望有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 2019-02-19
      • 2011-10-04
      • 2012-12-21
      • 1970-01-01
      • 2013-11-08
      相关资源
      最近更新 更多