NHibernate и ленивая загрузка: как получить только несколько строк из коллекции? - PullRequest
2 голосов
/ 25 мая 2009

При использовании NHibernate и отложенной загрузки, как бы я получил такое поведение:

У меня есть класс Customer, и у клиента много адресов (скажем, 100, чтобы сделать это более понятным).

Я загружаю строку клиента, я хочу получить доступ к 3 элементам из коллекции адресов.

Я не хочу, чтобы nHibernate загружал все 100 адресов, но при ленивой загрузке, насколько я понимаю, загрузит их все?

Я хочу только 3 из них, и я хочу загрузить все 3 одновременно, как бы я получил это поведение?

Ответы [ 6 ]

4 голосов
/ 25 мая 2009

Это зависит от

  • если вам нужен "только один" или определенный
  • если вам понадобятся другие элементы в списке позже в том же сеансе

Вы можете использовать

2 голосов
/ 25 мая 2009
<class name="Customer">
    <set name="Address" batch-size="3">
        ...
    </set>
</class>
1 голос
/ 25 мая 2009

Я думаю, что Lazy Loading вам здесь не поможет. Я бы взял эту ответственность на AddressDataProvider. Вы получите набор адресов, основанный на клиенте и других предикатах (я думаю, что первый адрес не имеет какой-либо коммерческой ценности. Сначала можно изменить еще одну вещь. Порядок, в котором адреса возвращаются, является произвольным.)

- The last visited address.
- The closest address to the customer address.
- The latest (added) address

и т.д.

Address GetLastVisited(Customer c);
Address GetClosest(Customer c);

Только мои 2 цента.

0 голосов
/ 27 мая 2009

Есть ли общие критерии для этих записей, которые вы хотите увидеть? (Например, что-то вроде текущего адреса ?. (скажем, Current addressFlag = 1?)

Если это так, то вы можете использовать условие Where в отображении коллекции.

Например:

<bag name="Addresses"  where="CurrentAddressFlag = 1" cascade="save-update" fetch="select" lazy="true">
      <key column="AddressId"/>
      <one-to-many class="Address"/>
</bag>
0 голосов
/ 25 мая 2009

Вы можете заполнить коллекцию, используя HQL или Критерии, которые будут выбирать только 1 адрес, однако тогда вы не сможете получить доступ к другим адресам, пока не перезагрузите объект.

В худшем случае вам понадобится ключевое слово "with" в Hibernate, которое не реализовано в NHibernate.

0 голосов
/ 25 мая 2009

Можно добавить размер пакета, но, уменьшив размер пакета, вы можете получить много вызовов базы данных при итерации по ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...