1

我有一个实体,我希望它具有孩子数量的属性。假设我有这两个表:

create table father
(
  id int,
  name
);

create table child
(
  id int,
  father_id int
);

我希望 Hibernate 中的父实体具有这样的属性:

private int countChildren;

从 SQL 的角度来看,这很容易:

SELECT f.id, f.name, count(father_id) as count_children
FROM father f JOIN child c ON f.id = c.father_id
GROUP BY f.id, f.name;

简单高效。但是,由于我想将它作为实体的 Hibernate 属性,所以我找到的最接近的是:

@Formula("(select count(*) from child c where c.father_id = id)")
private int countChildren;

然而,在幕后它是作为一个标量子查询执行的,其中对子表的访问是每个父记录的 - 效率非常低(像 Oracle 这样的一些数据库对这些类型的查询进行了一些优化,但我不想依赖于此,与带有 GROUP BY 的 SQL 版本相比,它仍然不是最优的)。

有没有一种休眠方式来解决这个问题?幕后执行的方式与上述 GROUP BY 示例类似?

4

1 回答 1

0

@Formula("(SELECT COUNT(*) FROM father f JOIN child c ON f.id = c.father_id WHERE f.id = id)")

最后一个 id 是您的实体字段名称。

于 2021-12-14T15:10:53.820 回答