У меня есть сущность, и я хочу, чтобы у нее был атрибут количества детей.
Допустим, у меня есть эти две таблицы:
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, выполняют некоторую оптимизацию для таких запросов, но я не не хочу на это полагаться, и он все еще не оптимален по сравнению с версией SQL с GROUP BY).
Есть ли Hibernate способ решить этот? Тот, который за кадром, выполняется аналогично приведенному выше примеру GROUP BY?