наличие объекта Hibernate со столбцом count дочерних элементов - без скалярного подзапроса - PullRequest
0 голосов
/ 23 мая 2019

У меня есть сущность, и я хочу, чтобы у нее был атрибут количества детей. Допустим, у меня есть эти две таблицы:

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?

...