2009-09-24 2 views
3

좀 실체가 :HQL 쿼리를 작성하는 방법, LAZY로 표시된 서브 테이블을 자동으로 조인합니까?

public class Album extends GenericAuditedEntity { 

    @OneToMany(fetch = FetchType.LAZY) 
    private Set<Item> itemSet = new HashSet<Item>(); 
    } 

을 그리고 난이 같은 HQL을 실행하면 는 em.createQuery ("앨범 a에서 선택") getResults()

이 많은 SQL 쿼리를 produses :. 하나는 앨범 테이블의 선택 데이터입니다. Smth이 같은 : 선택 ....에서 Album_table; 항목을 선택하기 위해 각 가져온 행에 대해 하나의 쿼리. Smth like this : select .... from Item_table iwhere i.Album_id = : Album_id;

하지만 em.createQuery을 실행할 때 .getResults()

가 하나 개의 SQL 쿼리를 produses (" 선택 a.id, 앨범 에서 을 b.id 내가 항목에 가입 왼쪽"). 하지만 결과는 일부 매개 변수 목록입니다.이 매개 변수는 엔티티에 수동으로 입력해야합니다.

HQL을 조인과 함께 자동으로 빌드하고 결과를 엔티티에 자동으로 넣을 수 있습니까? 가능한가?

답변

3

에 유형을 가져 세트 당신은 join fetch를 사용해야합니다 :

em.createQuery("select a.id, b.id from Album a left join fetch Item i ").getResults(); 

참고 위의 링크 상세하게 설명 것과 어떤 부작용이 있다는 것을. 당신이 ID를 검색하는 경우

+0

링크 Thx! 나는 많은 정보를 거기에서 발견했다. – Max

-1

lazy fetching을 사용하지 마십시오. 열망

+0

일반적으로 나쁜 조언입니다. 때때로 유용 할 수 있지만, 모든 연관을 열렬한 fetch로 설정하면 각 get()에서 데이터베이스 전체를 가져올 수 있습니다. – ChssPly76

+0

예. 우리는 크고 오래된 프로젝트를 가지고 있습니다. 큰 개체가있는 경우. 어디서나 열정적 인 - 매우 느립니다. – Max

2

당신이 Hibernate는 또한의 연결을 채울 것 같은 당신, 당신은 엔티티를 검색 할 수있는 ID를 필요가 없습니다 join fetch를 사용하는 경우 그러나 첫 번째 레벨 캐시를

em.createQuery("select a from Album a left join fetch a.itemSet").getResultList(); 

있어 채워진 객체/개체가 필요하면 생성자 사용을 고려하십시오.

em.createQuery("select new com.xxx.AlbumItem(a.id, b.id) from Album a left join fetch a.itemSet b").getResultList(); 
+0

죄송합니다. 하지만 예를 들어 ID에 대해서만 썼습니다. 실제로 나는 100 개 이상의 fied를 가져와 10 개의 엔티티에 합류해야합니다. – Max

관련 문제