Спящий родитель / ребенок ВЫБЕРИТЕ N + 1 выпуск - PullRequest
3 голосов
/ 03 августа 2010

Я создаю следующий сопоставленный суперкласс, который обеспечивает базовую реализацию отношений между родителями и дочерними элементами для создания списка родительских / дочерних элементов для неограниченного вложения элементов (т. Е. Категорий)Вся таблица с выборкой соединения на родительском и дочернем элементах, один выбор загружает все записи, и я могу с удовольствием пройтись по дереву.Моя проблема возникает, когда я указываю, чтобы получить узел на дереве.я хочу, чтобы узел и все его дочерние элементы были в одном выделении.ниже приведен hql для загрузки всей таблицы:

hql.append(String.format("tree from %s tree ", tableName));
hql.append("left join fetch tree.parent ");     
hql.append("left join fetch tree.children ");

, если я укажу имя узла, т.е.получите проблему SELECT N + 1.Я понимаю, почему это происходит (из-за tree.name =: name), но есть ли способ написать HQL, чтобы он загружал указанный узел и все его дочерние элементы?

Я просто пытаюсьнайти способ поддержки списка простых вложенных элементов, в котором я могу получить любой родительский узел и его дочерние элементы с помощью одного выбора

, заранее спасибо,

1 Ответ

1 голос
/ 03 августа 2010

Вы пытались использовать аннотацию @BatchSize?

@BatchSize(size = 20)

Ex:

@OneToMany(mappedBy = ..., fetch = FetchType.LAZY)
@BatchSize(size = 20)
public SortedSet<Item> getItems() { ... }

Тогда, если вы укажете присоединение к дочерним элементам в вашем HQL, вы сможете избежать n + 1 выбора. Я не уверен, неявно, есть ли способ указать размер пакета в операторе HQL.

...