Java 具有包含count children列的Hibernate实体-无标量子查询

Java 具有包含count children列的Hibernate实体-无标量子查询,java,sql,postgresql,hibernate,scalar-subquery,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_childr

我有一个实体,我希望它有一个子元素计数的属性。 假设我有两张桌子:

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版本相比,它仍然不是最优的)


有没有一种休眠方法可以解决这个问题?在幕后以类似于上述示例组的方式执行的操作?

我是否正确理解您的意思。您希望公式具有延迟加载行为。如果我告诉你如何使它懒惰,这会是一个答案吗?可能是亚历山大的复制品-不完全是。我知道如何建立@OneToMany关系并对其进行初始化,但在这种情况下,执行的查询从子表检索对象,我必须在代码中执行计数。我不需要子表的实际对象,只需要每个父行的对象数。看起来很有趣,我去看看。是的,这实际上没有什么帮助。我不想有一个懒惰的初始化:它有点错过了我的重点。我希望总是在同一个查询中使用该属性(对每个父行执行计数)。我是否理解正确。您希望公式具有延迟加载行为。如果我告诉你如何使它懒惰,这会是一个答案吗?可能是亚历山大的复制品-不完全是。我知道如何建立@OneToMany关系并对其进行初始化,但在这种情况下,执行的查询从子表检索对象,我必须在代码中执行计数。我不需要子表的实际对象,只需要每个父行的对象数。看起来很有趣,我去看看。是的,这实际上没有什么帮助。我不想有一个懒惰的初始化:它有点错过了我的重点。我希望始终在同一查询中具有该属性(对每个父行执行计数)。