我想使用fetch =" join"选择带有子节点的实体。映射策略 - 由于数据库中的大量记录。
查询如下所示:
IList<QuestionForVisit> questions = Session.CreateCriteria(typeof(QuestionForVisit))
.Add(Restrictions.Eq("IsTechnical", 0))
.CreateCriteria("ParentVisitModule")
.Add(Restrictions.Eq("Visit.Id", visitId))
.AddOrder(Order.Asc("Ordinal"))
.SetResultTransformer(Transformers.DistinctRootEntity)
.List<QuestionForVisit>();
return questions;
并映射:
<class name="QuestionForVisit" table="vis_question_for_visit" lazy="true">
<set name="Answers" lazy="true" inverse="true" cascade="all" fetch="join">
<key column="QuestionForVisitId"></key>
<one-to-many class="Diab.Model.Visits.AnswerForVisit"></one-to-many>
</set>
这个查询给了我QuestionForVisit及其子句Answers。但由于两个实体中有大量列,因此这会在Postgress数据库上生成相当慢的SQL。但我只需要根实体(QuestionForVisit)中的2列和来自子实体的两列(AnswerForVisit)。 减少列数可以显着减少查询的执行时间。 现在我创建了这样的东西,但它不起作用,因为:
1)它只返回没有答案的问题 2)我无法控制答案中的属性(列)。
IList<QuestionForVisit> questions = session.CreateCriteria(typeof(QuestionForVisit), "q")
.Add(Restrictions.Eq("IsTechnical", 0))
.CreateCriteria("ParentVisitModule", "pvm")
.Add(Restrictions.Eq("pvm.Visit.Id", visitId))
.AddOrder(Order.Asc("Ordinal"))
.SetResultTransformer(Transformers.DistinctRootEntity)
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("q.Symbol"), "Symbol")
.Add(Projections.Property("q.QuestionType"), "QuestionType"))
.SetResultTransformer(Transformers.AliasToBean(typeof(QuestionForVisit)))
.List<QuestionForVisit>();
我很感激有关这个问题的任何帮助。