gpt4 book ai didi

nhibernate - 通过投影查询返回实体

转载 作者:行者123 更新时间:2023-12-01 11:09:05 24 4
gpt4 key购买 nike

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

我已经使用 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 查询中使用的别名一致的公共(public)属性,这使得 AliasToBean 转换器可以从查询结果中填充 Foo 类型的实体。

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

更新:

您可以将 AliasToBean 结果转换器与 Criteria 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>();

关于nhibernate - 通过投影查询返回实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2146637/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com