我正在使用nHibernate和MySQL开发一个应用程序。
我有一个每秒运行的HQL命令,在这个命令中我执行“内部联接提取”,如下所示:
“来自订单o 内部联接获取o.Customer 订单o.Date”
它工作正常,但它填充了“Customer”的所有属性,我在DataBase中有很多列(差不多40列)。我只需要在名称,地址和电话等列中显示我的表示层。
有没有办法让一些属性进行Fecth Join或其他方式来提高性能?
...谢谢
干杯
答案 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绑定到视图。