Почему nHibernate не поддерживает LIMIT при выполнении "выборки соединения"? - PullRequest
1 голос
/ 29 марта 2010

В nHibernate, если вы выполните HQL-запрос с «присоединением» для активной загрузки дочерней коллекции, nHibernate проигнорирует SetMaxResults и SetFirstResult и попытается извлечь каждый элемент из базы данных . Зачем? Это поведение специфично для HQL, поскольку ICriteria поддерживает активную загрузку (хотя и с внешним объединением) и LIMIT.

Подробнее здесь http://www.lesnikowski.com/blog/index.php/nhibernate-ignores-setmaxresults-in-sql/.

Далее по теме и по другим вопросам, связанным с «соединением» (например, получение в результате декартового произведения): как указано здесь и здесь , возможно загружать дочерние коллекции с HQL и ICriteria. Однако ICriteria не допускает внутренних объединений (в результате чего получается декартово произведение), а HQL не допускает подкачку результатов на стороне БД.

а что делать, если нужно делать то же самое, но разбивать на страницы?

SetMaxResults, но это может вызвать проблемы с загрузкой. В этот момент мне может потребоваться выполнить два совершенно отдельных запроса: сначала получить только сущности, а затем загрузить связанные ассоциации.

Так в чем здесь проблема с подкачкой страниц и какое будет возможное решение?

1 Ответ

2 голосов
/ 31 марта 2010

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

 Id | CollectionId
-------------------
  1 | 1
  1 | 2
  2 | 3
  3 | 4
  3 | 5

Вы поняли идею. LIMIT для такого набора строк не будет иметь смысла, так как вы практически ограничите внутренние данные nHibernate вместо ограничения набора результатов, который вас действительно интересует. Однако я пока не нашел способа сделать пейджинг с активной загрузкой. Я думаю, что это может быть невозможно сделать только с одним запросом.

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