代码之家  ›  专栏  ›  技术社区  ›  Felipe Oriani

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

  •  2
  • Felipe Oriani  · 技术社区  · 15 年前

    我正在用nhibernate和mysql开发一个应用程序。

    我有一个每秒钟运行一次的hql命令,在这个命令中我执行一个“内部连接获取”,如下所示:

    “从订单O 内部连接获取O.客户 订单截止日期”

    它工作得很好,但它填充了“客户”的所有属性,我在数据库中有很多列(将近40列)。我只需要一些列(如姓名、地址和电话)显示在我的演示层中。

    有没有什么方法可以只得到一些进行fecth连接的属性,或者另一种提高性能的方法?

    谢谢。。。

    干杯

    3 回复  |  直到 15 年前
        1
  •  3
  •   Diego Mijelshon    15 年前

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

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

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

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

        2
  •  4
  •   Goblin    15 年前

    您可以进行辅助只读映射,该映射只将部分列提取到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”,或者您可以在没有完整数据的情况下保存它。

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

        3
  •  -1
  •   goku_da_master    15 年前

    您还可以只创建所需列和表联接的数据库视图。然后将NHibernate系到视图上。