有一个带有count子列的Hibernate实体-不带标量子查询

时间:2019-05-23 12:17:39

标签: java sql postgresql hibernate scalar-subquery

我有一个实体,我希望它具有子代数的属性。 假设我有以下两个表:

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版本相比,它仍然不是最佳选择。

是否有一种Hibernate方法来解决这一问题?幕后的执行方式与上述GROUP BY示例类似?

0 个答案:

没有答案