Условное объединение и сопоставление с NHibernate - PullRequest
0 голосов
/ 08 февраля 2011

Мне интересно, как я могу отобразить следующее с помощью NHibernate: у меня есть класс User, класс Preference и класс PreferenceOption.

Пользователь имеет много предпочтений (которые, в свою очередь, имеют параметры предпочтений). Система работает так, что для всех пользователей существует набор параметров по умолчанию, и отдельный пользователь может переопределить эти значения по умолчанию, указав свои собственные значения по умолчанию. Таким образом, нам нужно только сохранить системные значения по умолчанию (представленные в таблицах / классах Preference и PreferenceOption) и любые конкретные значения по умолчанию для пользователя (представленные в таблице / классе UserPreferenceOption).

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

1012 * Предпочтительны *

Id | Имя

PreferenceOption

Id | Значение | IsDefault | Preference_id

UserPreferenceOption

Id | UseThis | Preference_id | Option_id | User_id

SQL-запрос будет выглядеть примерно так:

select  PO.Id, PO.Value, PO.IsDefault, PO.Preference_Id, UPO.UseThis
from    PreferenceOption PO Left Outer Join UserPreferenceOverride UPO on PO.Id = UPO.Option_id
and UPO.Profile_id = THE_USER_ID

Можно ли сопоставить это с NHibernate?

1 Ответ

0 голосов
/ 09 февраля 2011

Я не совсем понимаю вашу инструкцию SQL для этого - но я сделал нечто подобное в NHibernate, и это сработало так: Вы связываете параметры предпочтений и параметры предпочтений пользователя с двумя отдельными пакетами. Затем создайте логику, чтобы при каждом предпочтении вы сначала просматривали параметры предпочтений пользователя, а затем выбирали параметр предпочтений по умолчанию.

Левые внешние объединения возможны для запросов в NHibernate: например, если вы используете API критериев, это createAlias("products", "product", Criteria.LEFT_JOIN), а в HQL это будет что-то вроде from Cat as cat join cat.mate as mate left join cat.kittens as kitten.

Надеюсь, это немного поможет.

...