2011-09-30 6 views
3

게으른로드 된 객체에 중첩 된 값을로드하는 것이 가장 좋은 방법인지 궁금합니다. 이 점을 더 잘 설명하는 예제를 제공하고 있습니다. 내가하고 싶은 예를 들어HQL/Nested Eager Loading

public class A{ 
    private B b; //Lazy loaded 
    private C c; //Lazy loaded 
    private D d; //Lazy loaded 
} 
public class B{ 
    private E e; //Lazy loaded 
    private F f; //Lazy loaded 
} 
public class C{ 
} 
public class D{ 
} 

:

System.out.println(a.getB().getE()); 

나는 위의 문을 실행 한 경우 내가 게으른로드 예외를 얻을 것입니다.

나는 항상 다음과 같은 작업을 수행 할 수

for (A a : somePossiblyLargeList) { 
    org.hibernate.Hibernate.initialize(a.getB().getE()); 
} 

하지만 분명히 성능을 빨아 것이다.

특정 중첩 된 필드로 미리 채워진 개체를 반환하는 사용자 지정 HQL 쿼리를 작성할 수있는 방법이 있습니까?

감사합니다.

답변

6

물론. (당신이 읽어야)를 Hibernate reference documentation에 설명 된대로 당신의 HQL 쿼리

사용 join fetch

:

select a from A a left join fetch a.b b left join fetch b.e e where ... 
+0

우수, 나는 그것을 확인해 보겠습니다. 감사! – user973479

+0

내 실제 상황이 내 예제보다 좀 더 까다 롭다고 생각합니다 ... 이것은 AB와 A_Lnk_B라는 링크 테이블 간의 다 대다 매핑입니다. 따라서 클래스 A는 집합을 포함합니다. 그 목록에서 모든 B에 대한 ID를 반복해야 할 것입니다. 그런 다음 B에서 E를 찾으려면 B에있는 ID를 사용합니다.이 항목이 Java A 개체로 다시 저장되는 방법을 개념화하는 데 어려움이 있습니다 ... – user973479

+0

a 선택 a 왼쪽 a join fetch a.aLinkBs alb 왼쪽 join 페치 alb.bb left join fetch be e where ... –