NHibernate和延迟加载:如何仅从集合中获取几行?

NHibernate和延迟加载:如何仅从集合中获取几行?,nhibernate,Nhibernate,当使用NHibernate和延迟加载时,我将如何获得这种行为: 我有一个Customer类,客户有很多地址(比如说100,这样更合理) 我加载我的客户行,我只想访问地址集合中的3个项目 我不希望nHibernate加载所有100个地址,但根据我的理解,如果延迟加载,会加载所有地址吗 我只需要其中3个,我想一次加载所有3个,我如何获得这种行为?可以添加批大小,但如果将批大小设置为较小,则在迭代时可能会有许多数据库调用。可以使用HQL或只选择1个地址的条件填充集合,但是,除非重新加载实体,否则您将无

当使用NHibernate和延迟加载时,我将如何获得这种行为:

我有一个Customer类,客户有很多地址(比如说100,这样更合理)

我加载我的客户行,我只想访问地址集合中的3个项目

我不希望nHibernate加载所有100个地址,但根据我的理解,如果延迟加载,会加载所有地址吗


我只需要其中3个,我想一次加载所有3个,我如何获得这种行为?

可以添加批大小,但如果将批大小设置为较小,则在迭代时可能会有许多数据库调用。

可以使用HQL或只选择1个地址的条件填充集合,但是,除非重新加载实体,否则您将无法访问其他地址

最糟糕的情况是,您需要Hibernate“with”关键字,而NHibernate中没有实现该关键字。


<class name="Customer">
    <set name="Address" batch-size="3">
        ...
    </set>
</class>
...
这取决于

  • 如果你需要“一个”或某个
  • 如果您以后在同一会话中需要列表中的其他项目
你可以用

  • 以筛选集合。这些过滤器在映射文件中定义,并在使用会话时激活和参数化
  • 它允许您在查询中筛选集合
  • 一次获取一定数量的元素

    • 我认为延迟加载在这里对您没有帮助。我将向AddressDataProvider承担此责任。您将获得一个基于customer和其他谓词的地址集合(我认为第一个地址没有任何业务价值。第一个地址还有一点可能会有所不同。返回地址的顺序是任意的。)

      等等


      只有我的2美分。

      您想查看的这些记录有共同的标准吗?。(例如:类似于当前地址的东西?)(比如说当前地址标志=1?)

      如果是这种情况,那么可以在集合映射上使用Where子句

      例如:

      
      
      - The last visited address.
      - The closest address to the customer address.
      - The latest (added) address
      
      Address GetLastVisited(Customer c);
      Address GetClosest(Customer c);
      
      <bag name="Addresses"  where="CurrentAddressFlag = 1" cascade="save-update" fetch="select" lazy="true">
            <key column="AddressId"/>
            <one-to-many class="Address"/>
      </bag>