我有一个实体,我希望它具有子代数的属性。 假设我有以下两个表:
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示例类似?