У меня есть древовидные структуры, которые хранятся в таблице БД. Таблица может хранить несколько деревьев. Мне нужен запрос, который вернет все узлы в одном дереве. Я использовал следующие сайты в качестве ресурсов, но запросы в них будут загружать все узлы для всех деревьев в 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, или это будет хорошо, если я просто использую таблицу саморегуляции. Переход с первым, кажется, требует немного большего обслуживания и, вероятно, немного более сложных запросов. Стоит ли оно того? Я не уверен, какие проблемы затрагивает статья.
это отличная идея, которую вы мне дали здесь !! вы нашли способ для стиха? – azerafati
и для информации, которую все используемые вами fetchTypes здесь используются по умолчанию! вы можете удалить их, и все они будут одинаковыми – azerafati