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