我有一个映射,它有两个对其他两个映射的引用。
首先,我会创建子标准还是创建别名?
所以我有:
Base.Property1
Base.Property2
Base.Reference1.Property1
Base.Reference1.Property2
Base.Reference2.Property1
Base.Reference2.Property2
我想将查询投影到这6个属性。
我已经设法在一个表的查询上使用Projections,但是在涉及多个表时我遇到了困难。
我会做什么(对于每个参考):
criteria.CreateCrtieria(bla)
.SetProjection(Projections.ProjectionList()
.Add(/*Add projections*/))
.SetResultTransformer(Transformers.AliasToBean(type));
或者只是创建别名并对原始条件进行投影,如下所示:
criteria.CreateAlias("reference1", "r1").CreateAlias("reference2", "r2")
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("baseProperty1")
.Add(Projections.Property("r1.property1")
.Add(Projections.Property("r2.property2")) /*etc*/
.SetResultTransformer(Transformers.AliasToBean(baseType));
我不知道前两个想法是否真的有效 - 他们似乎没有,但我不知道是不是因为我忘记了某些事情,或者他们是否完全错误。
感谢。
答案 0 :(得分:1)
使用Criteria API上的CreateAlias方法,您可以连接到引用的对象,并允许您突出显示属性。
您为每个引用的类型分配一个别名,然后您可以使用它来访问引用对象的属性。
另请注意,您需要确保投影对象中属性的名称与投影列表完全匹配。
你也可以在CreateAlias方法上指定JoinType,如果你想强制使用InnerJoin而不是LeftJoin。
var query = session.CreateCriteria<Base>()
.CreateAlias("Base.Reference1","ref1")
.CreateAlias("Base.Reference2","ref2")
.SetProjection(
Projections.ProjectionList()
.Add(Projections.Property("Base.BaseProperty"),"DtoBaseProperty")
.Add(Projections.Property("ref1.property1"),"DtoProperty1")
.Add(Projections.Property("ref2.property2"),"DtoProperty2")
)
.SetResultTransFormer(Transformers.AliasToBean(typeof(ProjectionDto)))
.List<ProjectionDto>();
public class ProjectionDto{
public string DtoBaseProperty;
public string DtoProperty1;
public string DtoProperty2;
}
答案 1 :(得分:0)
我的解决方案最终要求我写一个新的Transformer。我不会粘贴代码,因为它相当长,而且目前非常hacky。但对于任何有兴趣的人:
而不是.Add(Projections.Property("r1.property1")
我做了.Add(Projections.Property("r1.property1"), "SubType.Property1")
然后在变换器中,别名“SubType.Property1”具有与之关联的元组值。我将别名拆分并构造一个SubType,对于与之关联的任何别名,执行与现有转换器相同的操作(为该类型的那些属性赋值),然后最终将子类型对象设置为值。基本类型的财产。
它可能完全违背了Projections的概念,但它可以正常工作,而且效果很好,因为它在几个小时内就被黑了。