2012-10-02 42 views
0

假设我执行了一个理论HQL查询,如FROM Customer。并在Customer是一个getOrders()获得者返回一个ManyToOne集合的Order对象。这将执行一条SQL语句,从Customer中选择左连接到Order。如何平化Hibernate查询的结果

通过对象模型,我可以对客户进行编程迭代,然后迭代订单。

不过,我想分层对象模型转换为左的扁平表格结果加入这样的结果看起来很像这个SQL查询:

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

样品结果:

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

有没有一种简单的方法来做到这一点与休眠?

回答

1

取决于你想要的,你通过使用explicitl SELECT子句控制“标量”级别的。

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将是包含Customer和Order对象的Object数组的列表。

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]; 
     } 
    } 

希望这有助于!