Во-первых, в вашем примере вы выполняете 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.