досадная проблема N 1 при вызове criteria.List()

#nhibernate #nhibernate-mapping

#nhibernate #nhibernate-сопоставление

Вопрос:

смотрите подробное описание моих N 1 запросов при выполнении criteria.list с присоединением к другому присоединенному объекту. Я сейчас совершенно невежественен, возможно, у кого-нибудь появится идея.

это объекты: (правильно переименованные 🙂 ) Порядок -> Горшок <-> Крышка

порядок много к одному связан с Pot. (таким образом, разные ордера могут указывать на один и тот же банк). В таблице заказов есть поле «PotId» (с ключами из таблицы Pot).

Pot является взаимно однозначным, двунаправленно связанным с Cover — одна сторона «один к одному», другая — «много к одному». В таблице обложки есть поле «PotId» (с ключами из таблицы Pot).

Проблемы начинаются, когда я выполняю: session.Создайте критерий(typeof (порядок)).Создайте ALIAS(«горшок», «pot», JoinType.Соединение по левому краю).Список();

что я получаю, так это один запрос, извлекающий заказы банки, а затем N запросов, извлекающих обложку (по обложке.PotId). пробовал настраивать этот способ и другой, но безрезультатно. Я думал, что это может быть связано с проблемой «нет отложенной загрузки для взаимно однозначных ассоциаций», но я не могу обойти это. есть идеи? будем рады предоставить дополнительную информацию.

Ответ №1:

Я думаю, вы хотите, чтобы между pot и cover был указан второй псевдоним / объединение (или чтобы хотелось загрузить отношение pot -> cover в ваших сопоставлениях).

Существует также .Установите режим выборки в ICriteria, который может показаться вам интересным.

Комментарии:

1. Я рассматривал возможность получения соответствующих обложек заранее, но запрос генерируется динамически, и это усложняет задачу. Я также думал о стремительной загрузке отношения pot-> cover, но в реальном примере Order также указывает на Pot (многие к одному), и у меня есть два объединения в одной таблице — и все еще я вижу некоторые объекты, загруженные после запроса this (очень странно, не уверен почему). Я также использовал SetFetchMode (и другой createCriteria), но я вижу более или менее те же результаты…

Ответ №2:

Попробуйте установить для вашего batch-size объекта Cover значение > 1. Когда он перейдет к получению первого Cover , он должен загрузить любые другие, на которые ссылаются существующие Pot объекты, до предела batch-size .

Комментарии:

1. Я могу попробовать это, но я предпочитаю решение, которое заключается в O (1) обходах базы данных и O (1) запросах.