说我执行了像FROM Customer
这样的理论HQL查询。在Customer
中,getOrders()
getter返回ManyToOne Order
个对象的集合。这将执行一个SQL语句,从Customer中选择左连接到Order。
通过对象模型,我可以以编程方式迭代客户,然后迭代订单。
但是,我想将分层对象模型转换为左连接的平面表格结果,以便结果看起来与此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
使用Hibernate有一种简单的方法吗?
答案 0 :(得分:1)
使用explicitl select子句取决于您在“标量”级别所需的内容。
select c, o
from Customer c left join c.orders o
返回(Customer,Order)元组列表。或者:
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只是一个带有匹配构造函数的普通类。
答案 1 :(得分: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")
})
})
答案 2 :(得分: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];
}
}
希望这有帮助!