NHibernate: LeftOuterJoin без ассоциации - PullRequest
1 голос
/ 31 октября 2010

У меня есть следующая структура.

Сообщение (текст)

MessageReading (Сообщение, Пользователь)

Я хотел бы загрузить сообщения с соответствующим MessageReading, если это существует. Я могу добиться этого с HQL:

var query = session.CreateSQLQuery( 
@"SELECT {msg.*}, {mr.*} 
  FROM Message msg 
  LEFT OUTER JOIN MessageReading mr ON (mr.Message_Id = msg.Id  AND 
  mr.User_Id = :user)") 
.AddEntity("msg", typeof(Message)) 
.AddEntity("mr", typeof(MessageReading)) 
.SetParameter("user", user.Id);

Есть ли способ сделать то же самое с Criteria API? (Мне это нужно, потому что я используйте Rhino Security для добавления фильтрации авторизации в мои запросы)

1 Ответ

1 голос
/ 01 ноября 2010

Во-первых, в вашем примере вы выполняете SQL-запрос, используя базовый диалект вашей СУБД, а не HQL-запрос.Вот почему вы можете выполнить объединение без сопоставления ассоциации в вашей конфигурации NHibernate.Для выполнения HQL-запроса вы должны использовать метод session.CreateQuery.

Для выполнения этого запроса с использованием HQL или Criteria API вам необходимо сопоставление один-ко-многим <set name="Readings" ...> из класса Message в класс MessageReading.Класс Message должен иметь свойство Readings типа ISet<MessageReading>.С этим сопоставлением вы сможете использовать Criteria API следующим образом:

var criteria = session.CreateCriteria<Message>);
criteria.CreateAlias("Readings", "mr", JoinType.LeftOuterJoin);
criteria.Add(Restrictions.Eq("User", user));
criteria.SetResultTransformer(Transformers.DistinctRootEntity);

var results = criteria.List<Message>();

Это вернет список объектов Message и заполнит свойство Readings для каждого объекта.Преобразователь DistinctRootEntity гарантирует, что возвращается только одна копия каждого объекта Message, даже если существует несколько MessageReadings.

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