Внутреннее или правое внешнее объединение в Nhibernate и свободное владение Nhibernate в коллекции «многие ко многим» - PullRequest
6 голосов
/ 17 июня 2010

Как я могу заставить NHibernate сделать ПРАВОЕ внешнее соединение или ВНУТРЕННЕЕ соединение вместо ЛЕВОГО внешнего соединения для коллекции «многие ко многим»?

Причина, по которой я хотел бы сделать это, заключается в применении фильтрациик элементам коллекции.При левом соединении вы получаете то же количество строк, что и нефильтрованный запрос, но отфильтрованные элементы просто показывают NULL для всех полей.Однако при правильном соединении из запроса возвращается правильное количество строк и элементов.

Я ожидаю, что можно указать соединение где-нибудь в отображении коллекции ..

Ответы [ 2 ]

5 голосов
/ 27 июня 2010

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

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

Если критерий фильтра является статическим, вы можете указать предложение where в отображении. Я думаю, что это было бы рекомендуемым решением для вашей ситуации.

Обходной путь - сделать коллекцию частной в вашем объекте, а затем создать другое свойство, которое вызывает HQL-запрос для реализации внутреннего соединения и возвращает эту коллекцию. Эта возвращенная коллекция будет иметь нужную вам семантику, но вам понадобятся отдельные методы для добавления или удаления элементов из коллекции.

1 голос
/ 23 июня 2010

Вы можете использовать HQL-синтаксис NHibernate для генерации запроса, который напоминает SQL, но использует возможности отображения NHibernate.HQL поддерживает right outer join (или просто right join для краткости).Следующие страницы являются хорошими ссылками на язык запросов Hibernate NHQL:

...