使用HQL,您可以构建如下所示的查询,该查询将通过在select子句中使用逗号分隔列表为每个选定的行返回一个对象数组:
选择 mother,offspr,mate.Name 来自Eg.DomesticCat作为母亲 内心加入妈妈。作为伴侣 左外连接mother.Kittens as offspr
您如何使用ICriteria执行此操作?具体来说,我正在尝试构建一个分页查询,该查询也返回同一查询中的总行数。
Ayende展示了如何使用HQL(http://ayende.com/Blog/archive/2007/04/27/Paged-data--Count-with-NHibernate-The-really-easy-way.aspx)完成此任务。我需要使用ICriteria来复制它。
答案 0 :(得分:4)
我认为答案在于预取你想要的关联。这样,您可以一次性获取对象图形所需的部分。您可以在标准查询中执行此操作。
ICriteria query = session.CreateCriteria(typeof (Cat))
.SetFetchMode("Mate", FetchMode.Join)
.SetFetchMode("Kittens", FetchMode.Join);
IList<Cat> results = query.List<Cat>();
这将为您提供一份包含Mate和Kittens预先填充的猫的列表。然后,您可以导航到这些属性,而不会产生N + 1惩罚。如果你需要一个更扁平的结果我会用linq来做,也许是这样的。
var results = query.List<Cat>()
.Select((c) => new {mother = c, mate = c.Mate, offspr = c.Kittens});
这将为您提供具有给定属性的匿名类型的扁平列表。如果你需要的只是预取对象图,这将有效。但是,如果您需要预取计数或总和等内容,则需要检查Criteria查询的预测和别名部分。
还有一件事。如果您尝试完全复制上述查询,可以这样做。
ICriteria query = session.CreateCriteria(typeof (Cat), "mother")
.CreateAlias("Mate", "mate", JoinType.InnerJoin)
.CreateAlias("Kittens", "offspr", JoinType.LeftOuterJoin)
.SetResultTransformer(Transformers.AliasToEntityMap);
这将使您与hql查询基本相同,但是不使用索引列表,而是使用将别名映射到实体的字典。
答案 1 :(得分:2)
您可以通过这种方式将您的条件转换为计数条件
DetachedCriteria countCriteria = CriteriaTransformer.TransformToRowCount(criteria); // criteria = your criteria
rowCount = countCriteria.GetExecutableCriteria(session).UniqueResult<int>();
答案 2 :(得分:1)
Ayende还添加了多标准支持:http://ayende.com/Blog/archive/2007/05/20/NHibernate-Multi-Criteria.aspx。那显然是在2.0版本中。
答案 3 :(得分:0)
您还可以通过操作Criteria上的结果集来进行分页:
ICriteria query = session.CreateCriteria(typeof(Cat),“mother”)
query.SetFirstResult(X); // x =页面开始
query.SetMaxResults(Y); // y =页面大小
列出结果= query.List();