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

07-05-10 jackInAction
一个订单系统,使用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所需的全部数据

猜你喜欢