使用Hibernate如何解决这样的场景呢!

         
jackInAction
07-05-10 2 397

一个订单系统,使用Hibernate来建模就会包含Order、OrderItem、Product这么几种类型,其中OrderItem包含一个Amount属性和一个Product实例的引用。
用户常常提出这样的需求:给出订单号(OrderNumber)查找订单,列表显示明细,明细包括产品名称、单价、数量
我就在OrderItem的映射文件里面加入这样几句
<property name="ProductName">
<formula>( select Name from Product p where p.productId = productId)
</formula>
</property>
<property name="ProductPrice">
<formula>( select Price from Product p where p.productId = productId )
</formula>
</property>
只是这样一来,生成的SQL语句就成了
select
...,
...,
...,
(select Name from Product p where p.productId = productId) as ProductName,
(select Price from Product p where p.productId = productId) as ProductPrice
from OrderItems
where ......
这显然是效率低下的语句。
请教高人,有没有什么更好的办法,既能够获得Hibernate的便利,又不至于性能太低下呢。

banq
2007-05-10 17:28

>查找订单,列表显示明细,明细包括产品名称、单价、数量。

使用hibernate一定是围绕对象这个概念,需求实际就是输出订单对象的集合,在前台显示时就是遍历hibernate输出的订单对象集合。

你在配置中却将订单中字段单独使用数据表字段输出,而不是利用Hibernate特性(包括缓存)一次性获得多个完整订单对象,效率当然低。

对象是数据字段的包装,但不仅仅是。

jackInAction
2007-05-10 19:00

谢谢banq的指点
我理解为以下两点,不知对否
1.由于用户需要在列表中看到一个订单中每个Item的ProductName、ProductPrice和Amount,那么这些字段确实应该成为OrderItem类型的一个属性。
2.OrderItem表本身就只有三个字段:OrderNumber、ProductID、Amount。建立一个视图,
create v_OrderItem as
SELECT
OrderItem.OrderNumber,
OrderItem.ProductID,
OrderItem.Amount,
Product.ProductName,
Product.Price
FROM OrderItem INNER JOIN Product ON OrderItem.ProductID = Product.ProductID
将OrderItem类型映射到v_OrderItem,使得一次装入可以获得OrderItem所需的全部数据