2013-07-19 6 views
0

일부 조인에 이상한 문제가 발생했습니다. 간단히 말해서 왼쪽에 합류하면 내가 올바른 수의 행을 얻습니다. 내가 왼쪽 조인 가져 오기를 수행하면 예상보다 많은 행을 가져옵니다.더 많은 행을 반환하는 조인 가져 오기

내 엔티티 클래스는 내가 수업 시간에 네 의 보수이 나의 관계에서

public class One { 
    ... 
    private Set<Two> twos; 
} 

public class Two { 
    ... 
    private Set<Three> threes; 
} 

public class Three { 
    ... 
} 

(간결을위한 의사 코드를 사용하여) 각 클래스

에서 하나 아홉 열로 나는 네 개의 두 개의 클래스와 각각의 두 개의 세 개의 클래스로 하나의 클래스 하나를 반환 할 것으로 예상했다. 내가 왜 두 번째는이 증식하는 원인 가져 않습니다

List<One> res = em.createQuery("select o from One o left join o.twos t left join t.threes where o.id = 322", One.class).getResultList(); 
List<Two> twos = resultList.get(0).getTwos(); //results in four twos - CORRECT 

List<One> res = em.createQuery("select o from One o left join fetch o.twos t left join t.threes where o.id = 322", One.class).getResultList(); 
List<Two> twos = resultList.get(0).getTwos(); //results in four twos - CORRECT 

List<One> res = em.createQuery("select o from One o left join fetch o.twos t left join fetch.threes where o.id = 322", One.class).getResultList(); 
List<Two> twos = resultList.get(0).getTwos(); //results in thirty size twos - *INCORRECT* (is four * nine) 

를 사용하는 경우

내가이 얻을. 내 DB에 성능 문제가 있으므로 페치 조인을 시도하고 개선하려고합니다. 비록 내가 기대했던 것보다 더 많은 결과를 가지고있는 것처럼 보이지만 페치를함으로써.

내 ORD로 Oracle DBE 및 JPA2/hibernate를 사용하고 있습니다.

감사

내 hierachy에서 가짜 목록을 발견 @JB Nizet에서 주석으로 당
+1

목록이 아니라 집합입니까? –

+0

클래스'One','Two'와'Three'는'equals()'와'hashCode()'를 정확하게 구현합니까? –

+0

아하! JBNizet에게 감사드립니다. 구조가 훨씬 복잡해지기 때문에 이것을 너무 단순화했습니다. 내가 그것을 통과했을 때 나는 세트 였어야만했던 가짜리스트를 발견했다! 감사합니다 – RNJ

답변

0

. 이 문제를 해결하려면 모든 것이 세트를 사용하고 있는지 확인해야합니다. 두 개 이상의 목록이있는 경우 에 대한 JPA 오류가 발생하여 여러 개의 봉지를 가져올 수 없습니다. 하나의 목록이 있다면 실 거예요. 그러나 중복으로 끝날 것입니다.

+0

JPA가 아니라 최대 절전 모드 문제입니다. https://hibernate.atlassian.net/browse/HHH-1718을 참조하십시오. – Chris

관련 문제