是否有可能使用投影查询以返回一个实体?

我已经成功地与一个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。变压器被以同样的方式使用,但投影查询看起来使用标准稍有不同。下面是一个使用条件查询的示例:

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>();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top