Nhibernate 通过投影查询返回实体

Nhibernate 通过投影查询返回实体,nhibernate,activerecord,castle-activerecord,projection,Nhibernate,Activerecord,Castle Activerecord,Projection,是否可以使用投影查询返回实体 我已经用SQL查询成功地完成了这项工作(见下文),但找不到如何用投影查询完成这项工作 Dim sql As String = "SELECT {a.*}, {b.*} FROM a LEFT OUTER JOIN b ON a.pk = b.fk") ' Convert SQL results into entities {a} and {b} Dim query As IQuery = session.CreateSQLQuery(sql) _

是否可以使用投影查询返回实体

我已经用SQL查询成功地完成了这项工作(见下文),但找不到如何用投影查询完成这项工作

Dim sql As String = "SELECT {a.*}, {b.*} FROM a LEFT OUTER JOIN b ON a.pk = b.fk")

' Convert SQL results into entities {a} and {b}
Dim query As IQuery = session.CreateSQLQuery(sql) _
                                  .AddEntity("a", GetType(a)) _
                                  .AddEntity("b", GetType(b))

Return query.List()

是的,您可以从投影查询返回实体

如果使用HQL查询,可以在HQL select子句中为给定类指定构造函数:

IList<Foo> foos = session.CreateQuery(
    "select new Foo(f.Name, f.Value) from Foo f")
    .List<Foo>();
上面的类包含第一个HQL示例的有效构造函数。它还定义了与第二个HQL查询中使用的别名对齐的公共属性,这使得AliasToBean transformer可以根据查询结果填充Foo类型的实体

但是,从您给出的示例来看,似乎希望从同一个投影查询返回两种类型的实体。使用这些方法可能更难实现这一点。我做了两次快速测试,但都没有运气

更新:

您可以将AliasToBean结果转换器与Criteria API以及HQL一起使用。transformer的使用方式相同,但使用条件时投影查询看起来有点不同。下面是一个使用条件查询的示例:

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>();
IList foos=session.CreateCriteria()
.SetProjection(Projections.ProjectionList()项目)
.Add(Projections.Property(“名称”),“名称”)
.Add(Projections.Property(“Value”),“Value”))
.SetResultTransformer(Transformers.AliasToBean())
.List();

谢谢!理想情况下,我希望通过HQL使用CriteriaAPI。作为一个(临时)解决方案,我正在使用实体a的查询并急切地加载实体B。很高兴我能提供帮助!AliasToBean transformer也适用于Criteria API,我用一个示例更新了答案。
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; }
}
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>();