Sta*_*eld 3 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) _
.AddEntity("a", GetType(a)) _
.AddEntity("b", GetType(b))
Return query.List()
Run Code Online (Sandbox Code Playgroud)
是的,您可以从投影查询中返回实体.
如果您正在使用HQL查询,则可以在HQL select子句中为给定类指定构造函数:
IList<Foo> foos = session.CreateQuery(
"select new Foo(f.Name, f.Value) from Foo f")
.List<Foo>();
Run Code Online (Sandbox Code Playgroud)
此示例要求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>();
Run Code Online (Sandbox Code Playgroud)
为了使这些示例有效,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; }
}
Run Code Online (Sandbox Code Playgroud)
上面的类包含第一个HQL示例的有效构造函数.它还定义了与第二个HQL查询中使用的别名对齐的公共属性,这使得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>();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4881 次 |
| 最近记录: |