Да, вы можете возвращать сущности из запросов проекции.
Если вы используете запрос HQL, вы можете указать конструктор для данного класса в предложении выбора HQL:
IList<Foo> foos = session.CreateQuery(
"select new Foo(f.Name, f.Value) from Foo f")
.List<Foo>();
В этом примере требуется, чтобы класс Foo имел конструктор, соответствующий сигнатуре, используемой в запросе HQL. То есть:
Вы также можете использовать AliasToBean ResultTransformer, который автоматически сопоставляет значения, возвращаемые запросом, со свойствами данного типа. Этот подход требует, чтобы псевдонимы, используемые в запросе, сопоставлялись непосредственно со свойствами данного типа. Например:
IList<Foo> foos = session.CreateQuery(
"select f.Name as Name, f.Value as Value from Foo f")
.SetResultTransformer(Transformers.AliasToBean<Foo>())
.List<Foo>();
Чтобы эти примеры работали, класс Foo может выглядеть так:
public class Foo
{
public Foo() { }
public Foo(string name, double value)
{
Name = name;
Value = value;
}
public virtual string Name { get; set; }
public virtual double Value { get; set; }
}
Приведенный выше класс содержит допустимый конструктор для первого примера HQL. Он также определяет общедоступные свойства, соответствующие псевдонимам, используемым во втором HQL-запросе, что позволяет преобразователю AliasToBean заполнять сущности типа Foo из результатов запроса.
Однако из приведенного вами примера кажется, что вы хотите вернуть два типа сущностей из одного и того же проекционного запроса. Это может быть труднее достичь с использованием этих методов. Я сделал пару быстрых тестов, но безуспешно.
Обновление:
Вы можете использовать преобразователь результатов AliasToBean с Criteria API, а также с HQL. Трансформатор используется таким же образом, но запрос проекции выглядит немного иначе с использованием Критериев. Вот пример, в котором используется запрос критериев:
IList<Foo> foos = session.CreateCriteria<Foo>()
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("Name"), "Name")
.Add(Projections.Property("Value"), "Value"))
.SetResultTransformer(Transformers.AliasToBean<Foo>())
.List<Foo>();
person
Erik Öjebo
schedule
27.01.2010