通过投影查询返回实体

问题描述:

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

我已经用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>(); 

此示例要求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结果变压器的标准API以及与HQL。变换器以相同的方式使用,但使用Criteria,投影查询看起来有点不同。以下是使用条件查询的示例:

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>(); 
+0

谢谢!理想情况下,我想通过HQL使用标准API。 作为一个(临时)解决方法,我使用实体A的查询并迫切地加载实体B. – Starfield 2010-01-28 16:06:44

+0

很高兴我能帮上忙! AliasToBean变换器也适用于Criteria API,我用一个例子更新了答案。 – 2010-01-28 17:31:10