如何展平Hibernate查询的结果

时间:2012-10-02 14:47:27

标签: java hibernate

说我执行了像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有一种简单的方法吗?

3 个答案:

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

希望这有帮助!