Я не знаю, возможно ли это с помощью HQL, но с помощью API критериев NHibernate вы можете сделать это:
ICriteria criteria = session.CreateCriteria (typeof(Technology));
criteria.SetFetchMode ("TechnologyDescriptions", FetchMode.Lazy);
var list = criteria.List<Technology>();
Однако, это, вероятно, не совсем то, что вы хотите. Описание TechnologyDescription не будет получено прямо сейчас, но оно будет получено при обращении к ним (то есть при первом вызове свойства TechnologyDescription).
При работе с NHibernate не следует думать с точки зрения «данных». Скорее, вы должны думать с точки зрения «сущностей».
При извлечении сущности вы хотите извлечь сущность целиком (напрямую или ленивым образом). Невозможно частично извлечь сущность, и это совершенно очевидно;
Что должен делать NHibernate с сущностью, которую вы частично извлекли, при попытке сохранить эту сущность?
Что-то еще, что появляется в моей голове:
Я полагаю, вы хотите получить технологии, и ничего не связано, потому что вы хотите отобразить их в обзоре или что-то в этом роде?
В таком случае вам стоит взглянуть на «Преобразования».
Например, вы можете создать дополнительный класс с именем TechnologyView
, который выглядит следующим образом:
public class TechnologyView
{
public int Id
{
get;
private set;
}
public string Name
{
get;
private set;
}
public string Abbreviation
{
get;
private set;
}
private TechnologyView()
{
// Private constructor, required for NH
}
public TechnologyView( int id, string name, string abbreviation )
{
this.Id = id;
this.Name = name;
this.Abbreviation = abbreviation;
}
}
После того, как вы это сделаете, вы должны сообщить NHibernate о существовании этого класса.
Это можно сделать, например, импортировав класс в файл hbm.xml. (Я не знаю, как это сделать с помощью Fluent).
<import class="MyNamespace.TechnologyView" />
После этого вы можете создать запрос (используя HQL или Критерии), который извлекает TechnologyView
экземпляров. NHibernate достаточно умен, чтобы генерировать производительный SQL-запрос.
с использованием HQL:
IQuery q = s.CreateQuery ("select new TechnologyView (t.Id, t.Name, t.Abbreviation) from Technology t");
с использованием критериев:
ICriteria criteria = s.CreateCriteria (typeof(Technology));
criteria.SetResultTransformer (Transformers.AliasToBean (typeof(TechnologyView));
var result = criteria.List<TechnologyView>();