2013-05-02 2 views
1

엔티티간에 일대 다 관계가 있습니다. 이 JPQL 쿼리를 수행 할 때 :JPA/Hibernate 중복 레코드

는 부모의 부모로부터

SELECT 부모는 부모가 어린이 2 명, 오직 하나의 부모가 한 아이를, 아무도가있을 때 내가 중복 레코드를 얻을 ...

parent.child 아이를 가입 아무 아이도 없다 (아무도 아이가 없을 때 아무도). SQL 데이터베이스에는 Parent의 복제본이 없습니다.

@Entity(...) 
public class Parent { 

    @Id 
    Long parentId; 

    @OneToMany(mappedBy = "parentID") 
    List<Child> children; 
} 

@Entity(...) 
public class Child {a 

    Long parentId; 
} 

내가 간결성을 위하여 많은 코드를 생략하지만 당신에게 내가 뭘하려고 오전의 강한 아이디어를 줄 것이다 :

엔티티는 다음과 같이 선언됩니다. 부모와 부모의 관계는 쿼리에서 반환 된 자식과 함께 필요하기 때문에 관계는 부모 측에서 정의됩니다.

+0

당신이 어떻게 지속 할 게시물 – Freakyuser

+0

을 편집하여 게시물의 끝 부분에 질문을 추가하는 경우 그것은 좋은 것? 부모와 자식이 계단식으로 지속되거나 각 개체를 별도로 유지합니다. 이것은 많은 것을 명확히 할 것입니다. – cinhtau

+0

Freakyuser, 내 문제가 내 쿼리에서 중복되는 것이 분명하다고 생각했습니다. – user2343647

답변

1

당신은 DISTINCT 키워드를 사용하여 중복을 제거 할 수 있습니다

SELECT DISTINCT parent FROM Parent parent JOIN parent.child child WHERE ... 

편집 : DISTINCT 키워드에 관계없이 이러한 중복의 존재 TEH 이유의 쿼리 결과에서 중복 remoe하는 데 사용됩니다. 때로는 그 이유가 중복 된 DB 항목입니다. 하지만 더 자주 복제본은 JOIN 문장의 결과이므로 사용 사례는 완전히 합법적입니다.

그러나 관계를 양방향으로 만들어 명시 적 조인과 DISTINCT 키워드를 피할 수 있습니다. 그런 다음 당신이 사용할 수있는 암시 적 탐색을 통해 조인

SELECT parent FROM Parent parent WHERE parent.children... 
+0

고마워, 효과가 있지만 DISTINCT 키워드는 쿼리에서 생성 된 중복이 아닌 DB에있는 중복을 제거하는 것이라고 생각했습니다. – user2343647

+0

@ user2343647 - 오신 것을 환영합니다. :) 추가 정보를 추가했습니다. 편집을 참조하십시오. – kostja