Hibernate рекурсивная выборка присоединения не рекурсивно выбирает всех детей - PullRequest
0 голосов
/ 20 марта 2012

У меня есть структура типа каталога, представленная в виде объектов, т. Е. Думаю, объект Каталога и объект Файла.

Объект Каталога имеет коллекцию объектов Файла и набор объектов Каталога.

Iхочу получить корневой каталог и «предварительно загрузить» все каталоги и файлы.

Я пытаюсь:

String queryString = "SELECT DISTINCT d FROM " + 
   Directory.class.getSimpleName() + 
   " d LEFT JOIN FETCH d.files LEFT JOIN FETCH d.directories child LEFT JOIN FETCH child.files LEFT JOIN FETCH child.directories WHERE f.root = :isRoot);
Query query = em.createQuery(queryString);
query.setParameter("isRoot", true);

Directory dir = (Directory) query.getSingleResult();

Запрос работает, он просто не загружает все.Я получаю все корневые каталоги и корневые файлы, но когда я начинаю заходить в подкаталоги и получать файлы, делаются запросы.IE кажется, что рекурсия не работает.

Я также попробовал просто JOIN FETCH (который, я думаю, выполняет выборку внутреннего соединения) без удачи.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 16 мая 2013

Я столкнулся с той же проблемой, но в моем случае в одной таблице хранилось несколько независимых деревьев. Таким образом, «select n from Node n left join fetch n.Children» выбрал бы все деревья в память, пока мне нужен был один. Добавление предложения WHERE нарушило бы рекурсию.

Итак, я использовал помощника по рекурсии внутри моего DAO:

private Node fetchChildren(Node parent) {
    Hibernate.initialize(parent.getChildren());
    for (Node child : parent.getChildren()) {
        fetchChildren(child);
    }
    return parent;
} 
0 голосов
/ 20 марта 2012

Вы определили выборку между сущностями как нетерпеливую ( @ OneToMany (fetch = FetchType.EAGER) )?

Похоже, это может решить проблему начальной выборки для вашей проблемы ( более подробный ответ ).

ответ на ссылку комментария esaj содержит способ справиться с рекурсией.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...