通过投影查询返回实体

3

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

我已经成功地使用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()
1个回答

6

是的,你可以从投影查询中返回实体。

如果你正在使用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类型的实体。
然而,从您提供的示例来看,似乎您想从同一投影查询中返回两种类型的实体。使用这些方法可能更难实现。我进行了几次快速测试,但没有成功。
更新:
您可以在Criteria API和HQL中使用AliasToBean结果转换器。转换器的使用方式相同,但是使用Criteria时投影查询看起来有些不同。以下是使用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>();

谢谢!理想情况下,我希望使用Criteria API而不是HQL。作为(临时)解决方法,我正在使用实体A的查询并急切地加载实体B。 - Starfield
很高兴能够帮忙!AliasToBean转换器也可以与Criteria API一起使用,我已经更新了答案并提供了一个示例。 - Erik Öjebo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接