NHibernate内部联接只获取一些列?

时间:2010-10-12 18:19:34

标签: c# mysql nhibernate hibernate

我正在使用nHibernate和MySQL开发一个应用程序。

我有一个每秒运行的HQL命令,在这个命令中我执行“内部联接提取”,如下所示:

  

“来自订单o 内部联接获取o.Customer 订单o.Date”

它工作正常,但它填充了“Customer”的所有属性,我在DataBase中有很多列(差不多40列)。我只需要在名称,地址和电话等列中显示我的表示层。

有没有办法让一些属性进行Fecth Join或其他方式来提高性能?

...谢谢

干杯

3 个答案:

答案 0 :(得分:4)

您可以创建一个辅助只读映射,只将部分列提取到Dto(数据传输对象)中:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Your.NameSpace" assembly="Your.Assembly">
  <class name="OrderDto" table="[Order]" schema-action="none" lazy="false" mutable="false">
  <id name="Id">
    <generator class="native"/>
  </id>
  <many-to-one name="CustomerDto" class="CustomerDto"/>
  <!-- Other properties-->
  </class>
</hibernate-mapping>

通过这种方式 - 您可以完全控制从数据库中取出的内容。虽然有一个反面 - 确保它被标记为mutable =“false”,否则你可能会在没有完整数据的情况下保存它。

如果你真的想变得疯狂 - 你让OrderD实现与普通Order相同的接口 - 然后当要求一个尚未加载的属性时 - 你获取完整的订单。这增加了相当多的复杂性,但是你获得了极大的灵活性,并且能够使用Dto代替真实对象,并具有Dto的所有性能优势。 (这也称为代理模式,而第一位有时称为PresentationModel,因为它是为没有正常业务逻辑的表示而定制的。)

答案 1 :(得分:3)

如果您只是寻找某些属性,请不要使用join fetch,因为这不是它的用途。

相反,选择您想要的属性并(可选)用它们水合DTO。您甚至不需要显式连接:

select o, o.Customer.Name, o.Customer.Address
from Order o
order by o.Date

返回每行的元组(object[]),其中第一个元素是订单,第二个元素是客户名称等。

答案 2 :(得分:-1)

您还可以创建所需的列和表连接的数据库视图。然后将nhibernate绑定到视图。