0

假设我执行了一个理论上的 HQL 查询,例如FROM Customer. inCustomer是一个getOrders()getter,它返回一个 ManyToOneOrder对象集合。这将执行一条 SQL 语句,从带有左连接到 Order 的 Customer 中进行选择。

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

但是,我想将分层对象模型转换为左连接的平面表格结果,以便结果看起来很像这个 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 做到这一点?

4

3 回答 3

1

取决于您在通过使用显式选择子句控制的“标量”级别上想要什么。

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 只是一个具有匹配构造函数的普通类。

于 2012-10-02T15:31:49.603 回答
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")
    })
})
于 2012-10-02T14:58:19.290 回答
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];
        }
    }

希望这可以帮助!

于 2012-10-02T16:28:13.290 回答