2012-10-02 2 views
0

FROM Customer과 같은 이론적 인 HQL 쿼리를 실행했다고 가정 해 보겠습니다. 그리고 CustomerOrder 개체의 ManyToOne 컬렉션을 반환하는 getOrders() 게터입니다. 그러면 Customer에서 왼쪽 조인을 사용하여 Order로 선택하는 SQL 문이 실행됩니다.Hibernate 쿼리의 결과를 평탄하게 만드는 방법

개체 모델을 통해 프로그래밍 방식으로 Customers를 반복 한 다음 Orders를 반복 할 수 있습니다.

SELECT * 
FROM Customer 
LEFT JOIN Order on Customer.customerId = Order.customerId 

샘플 결과 :

결과가 많은이 SQL 쿼리처럼 보일 것이다 있도록

는 그러나, 나는 가입 왼쪽의 평평한 표 결과에 계층 적 개체 모델을 변환 할

Customer.customerId ... Order.orderId Order.customerId ... 
1      200   1 
2      201   2 
2      202   2 
3      NULL   NULL 

Hibernate에서 이것을 쉽게 할 수있는 방법이 있습니까?

답변

1

당신은 당신이 explicitl 선택 절을 사용을 통해 제어하는 ​​"스칼라"수준에서 원하는 것을 따라 다릅니다.

select c, o 
from Customer c left join c.orders o 

(고객, 주문) 튜플의 목록을 반환합니다. 또는 :

select c.id, c.name, o.id, ... 
from Customer c left join c.orders o 

그러면 원자 조각의 스칼라 투영이 반환됩니다.

두 경우 모두 목록을 반환합니다. 당신은 (두 번째 경우 이럴에서 정말로 그것보다 유용) 두 경우 모두에서 "동적 인스턴스"를 사용할 수 있습니다 :

select new CustomerOrderSummary(c.id, c.name, o.id, ...) 
from Customer c left join c.orders o 

을 CustomerOrderSummary이 생성자를 일치 단지 일반 클래스입니다.

+0

동일한 데이터를 투영하는 3 가지 다른 방법에 대해 자세히 설명합니다. – spoulson

0

가능하면 결과 집합을 표현할 수 있습니다. 이 예에서

http://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/query_native.html :

@SqlResultSetMapping(name="GetNightAndArea", entities={ 
    @EntityResult(name="org.hibernate.test.annotations.query.Night", fields = { 
     @FieldResult(name="id", column="nid"), 
     @FieldResult(name="duration", column="night_duration"), 
     @FieldResult(name="date", column="night_date"), 
     @FieldResult(name="area", column="area_id") 
    }), 
    @EntityResult(name="org.hibernate.test.annotations.query.Area", fields = { 
     @FieldResult(name="id", column="aid"), 
     @FieldResult(name="name", column="name") 
    }) 
}) 
+0

이 전략은 테이블 형식 데이터에서 엔터티 계층 구조로 이동하는 것처럼 보입니다. – spoulson

0

Object []에서 결과를 검색해 볼 수 있다고 생각합니다. 아래 :

EntityManager entityManager = EntityManager.getEntityManager(); 
    Query query= entityManager.createQuery("select cust, ord from Customer cust left outer join cust.orders ord where cust.customerId = :customerId"); 
    tradeQuery.setParameter("customerId", aCustomerId); 
    List<Object[]> resultList = (List<Object[]>)query.getResultList(); 

검색된 resultsList는 고객 및 주문 개체가 플랫으로 들어있는 개체 배열 목록입니다.

if(!resultList.isEmpty()){ 
     Iterator<Object[]> iter = resultList.iterator(); 
     while(iter.hasNext()){ 
      Object[] resultObj = (Object[])iter.next(); 
      Customer customer= (Customer)resultObj[0]; 
      Order order = (Order)resultObj[1]; 
     } 
    } 

희망이 있습니다.

관련 문제