2011-04-07 3 views
1

주소 목록이있는 person 개체가 있고 매핑에서 열심히 가져올 수있는 주석이 있습니다.jpa criteriabuilder 쿼리 사용 안 함 가져 오기 사용 안 함

필자는 person 객체를 가져오고 싶지만 주소를 가져 오지 않고 criteriabuilder 쿼리를 사용합니다. 조건 쿼리만으로 열정적 인 feting을 비활성화하려면 어떻게합니까? 방법이 있니?

실제 코드는 간단하지 않습니다 ... 이것은 단지 예제를 제공하는 것입니다.

미리 감사드립니다.

답변

2

일반적으로 매핑에서 LAZY 페칭을 사용한 다음 JPQL "join fetch"옵션을 사용하여 필요할 때 열심히 가져 오는 것이 좋습니다.

JPA에서는 전체 엔티티가 아닌 엔티티에서 원하는 데이터 만 선택할 수 있으므로 관계를 피할 수 있습니다. 또한 셸 인스턴스를 생성하기 위해 생성자 쿼리를 사용할 수도 있습니다 (이러한 인스턴스는 관리되지 않습니다).

쿼리에서 열망하는 관계를 게으르게 만드는 방법은 페치 그룹을 사용하는 것입니다. JPA는 반입 그룹을 지원하지 않지만 EclipseLink와 같은 일부 JPA 제공 업체는 수행합니다. EclipseLink에서 @FetchGroup 주석 또는 쿼리 힌트를 사용하여 패치 그룹을 정의 할 수 있습니다.

+0

나는 생성자 쿼리 아이디어를 좋아한다. 나는 그것을 시도 할 것이다. 도와 주셔서 감사합니다 – user373201

0

나는 생각합니다. OpenJPA documentation에서 :

9.1.1 절. "서브 클래스 가져 오기 모드"에서 설명한 메타 데이터 확장을 사용하여 개별 클래스에 대한 기본 서브 클래스 가져 오기 모드를 지정할 수 있습니다. 그러나 클래스 설정으로 런타임 패치 모드를 "업그레이드"할 수는 없습니다. 런타임 패치 모드가 none이면 메타 데이터 설정에 관계없이 열상 하위 클래스 데이터 페치가 발생하지 않습니다.
이것은 eager fetch mode 메타 데이터 확장에도 적용됩니다 (9.2.1 절. "Eager Fetch Mode"참조). 이 확장을 사용하여 필드에서 eager 가져 오기를 비활성화하거나 컬렉션이 병렬 선택보다 조인을 사용하도록 선언하거나 그 반대의 경우도 마찬가지입니다.

섹션 9.2.1 here.