2012-04-12 3 views
3

У меня есть древовидные структуры, которые хранятся в таблице БД. Таблица может хранить несколько деревьев. Мне нужен запрос, который вернет все узлы в одном дереве. Я использовал следующие сайты в качестве ресурсов, но запросы в них будут загружать все узлы для всех деревьев в PersistenceContext (не так ли загружать всю таблицу?). Я не хочу этого делать, я хочу только загрузить одно дерево. Как мне это достичь?Запрос JPA для получения всех узлов в одном дереве

Я использую JPA 2 с Hibernate в качестве поставщика.

OpenJPA 1.2.x select tree structure using JPQL
http://www.tikalk.com/java/load-a-tree-with-jpa-and-hibernate#comment-1821

[UPDATE] На основании предложение от @bennidi, интересно, могу ли я использовать что-то вроде этого:

@Entity 
public class Node { 

    private String name; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "rootId") 
    private Node root; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "parentId") 
    private Node parent; 

    @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @OrderBy("name") 
    private List<Node> children = new LinkedList<Node>(); 
} 

JPQL запроса:

select distinct n from Node n left join fetch n.children where n.rootId = ROOT_ID 

У меня есть вопрос, хотя, должен ли я создать вторую таблицу для поддержания отношений родитель-ребенок, как в this article, или это будет хорошо, если я просто использую таблицу саморегуляции. Переход с первым, кажется, требует немного большего обслуживания и, вероятно, немного более сложных запросов. Стоит ли оно того? Я не уверен, какие проблемы затрагивает статья.

+0

это отличная идея, которую вы мне дали здесь !! вы нашли способ для стиха? – azerafati

+0

и для информации, которую все используемые вами fetchTypes здесь используются по умолчанию! вы можете удалить их, и все они будут одинаковыми – azerafati

ответ

0

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

Посмотрите на этот пост: http://www.codeproject.com/Articles/8355/Trees-in-SQL-databases

+0

Спасибо за статью. Это дало мне представление, я собираюсь обновить свой первоначальный вопрос. – citress

+0

Я думаю, что предлагаемый код/​​сопоставление выглядит очень многообещающим. Работает ли он так, как ожидалось? – bennidi

+0

До сих пор в моих интеграционных тестах, похоже, что все работает правильно. – citress

Смежные вопросы