2012-04-12 3 views
3

DB 테이블에 트리 구조가 저장되어 있습니다. 테이블은 여러 개의 트리를 저장할 수 있습니다. 단일 노드 트리에있는 모든 노드를 반환하는 쿼리가 필요합니다. 다음 사이트를 리소스로 사용했지만 쿼리가 모든 트리의 모든 노드를 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

[업데이트] 나는이 같은 것을 사용할 수 있는지 @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 

을 비록 부모님과 자식 관계를 유지하기 위해 두 번째 테이블을 만들어야합니까?, 아니면 방금 자기 참조 테이블을 사용하면 괜찮을 것입니다. 이전 버전을 사용하면 약간 더 많은 유지 관리가 필요하고 아마도 좀 더 복잡한 쿼리가 필요할 것 같습니다. 그만한 가치가 있니? 기사에서 다루고있는 문제가 확실하지 않습니다.

+0

이것은 당신이 내게 준 좋은 아이디어입니다 !! 부검을위한 길을 찾았습니까 ?? – azerafati

+0

그리고 여기에서 사용하는 모든 fetchTypes 정보가 기본값입니다! 당신은 그 (것)들을 제거 할 수 있고 모두 동일 할 것입니다 – azerafati

답변

0

관계형 데이터베이스에 재귀 구조를 저장하는 것이 자연스럽지 않다고 생각합니다. 또한 질문에 대한 대답은 노드와 트리를 모델링하기 위해 선택한 스키마에 따라 달라집니다. 부모 하위 관계를 외래 키로 보유하고있는 자체 참조 노드 테이블이있는 경우 하나의 쿼리로 특정 노드의 하위 노드를 모두 선택할 수있는 방법이 없습니다. 난 당신이 각 트리에 대한 테이블을 가지고 각 노드가 그 나무를 참조해야한다고 생각합니다. 그런 다음 특정 트리의 모든 노드를 선택하고 노드를 분석하여 트리 구조를 만들 수 있습니다.

이 게시물을 보시길 바랍니다 : http://www.codeproject.com/Articles/8355/Trees-in-SQL-databases

+0

기사를위한 감사합니다. 이것은 저에게 아이디어를 주었고, 저는 원래의 질문을 업데이트 할 것입니다. – citress

+0

나는 제안 된 코드/매핑이 매우 유망 해 보인다고 생각한다. 예상대로 작동합니까? – bennidi

+0

지금까지 통합 테스트에서 모든 것이 올바르게 작동하는 것처럼 보입니다. – citress

관련 문제