2011-02-11 6 views
2

최대 절전 모드를 사용하여 Foo의 수 (x)를 선택했습니다. 각 foo는 lazy fetching으로 설정된 일대 다 콜렉션 bar와 baz를 가지고 있습니다. 각 foo에 대해 bar와 baz를 채워야 할 것이므로 컬렉션 당 발행 할 subselect (2 * x + 1 select)를 원하지는 않을 것입니다.두 개의 일대 다 컬렉션을 사용하여 최대 절전 모드 엔티티 쿼리하기

그러나 두 세트 모두 반드시 Cartesian 제품 (bar x baz)을 반환하므로 setFetchMode (FetchMode.JOIN)을 둘 다 설정하지 않아도됩니다. 또한 foo와 bar를 List로 정의하면 중복 항목을 받게됩니다. 두 가지 Criterias를 발행 할 수 있습니다.

List<Foo> foos; 
foo = session.createCriteria(Foo.class).setFetchMode("bar", FetchMode.JOIN).list(); 
foo = session.createCriteria(Foo.class).setFetchMode("baz", FetchMode.JOIN).list(); 

코드는 다소 엉성한 것처럼 보입니다. 첫 번째 쿼리가 불필요한 것 같습니다. 술집과 바즈를 가져 오는 더 좋은 방법이 있습니까?

답변

1

기준을 덤프하고이를 위해 HQL을 사용합니다.

String hql = "select new list(foo.bar, foo.baz) from Foo foo"; 
Query query = session.createQuery(hql); 
List list = query.list; 
Bar bar = list.get(0); 
Baz baz = list.get(1); 

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html

+0

foo는 내가 좋아 추가로 회원 (비 컬렉션)가 무엇입니까? 개별적으로 선택 하시겠습니까? – schmmd

+0

당신은 select foo.name, new list (foo.bar, foo.baz)를 선택할 수도 있습니다 ... 제 쿼리는 실제로리스트의리스트를 반환한다고 생각합니다. 그러나 당신은 그것으로 놀 수 있습니다. 지도를 반환 할 수도 있습니다. "새지도 (max (bodyWeight)를 max, min (bodyWeight)를 min, 카운트 (*)를 n으로 지정) 등 재미있게 놀아 라 고양이 고양이에서"일치하는 생성자를 가진 모든 것. – Speck

+0

나는 지금 두 가지 Criteria 쿼리를 고수하고 있지만 훌륭한 대답을 주셔서 감사합니다 ;-) – schmmd

관련 문제