如何使用 NHibernate CreateCriteria 选择一张表
Posted
技术标签:
【中文标题】如何使用 NHibernate CreateCriteria 选择一张表【英文标题】:How to select one table using NHibernate CreateCriteria 【发布时间】:2012-07-05 13:07:53 【问题描述】:如何在 Nhibernate 中使用 CreateCriteria 创建以下 SQL 语句:
SELECT distinct top 20 a.* from ActivityLog a
left join WallPost w on a.ActivityLogId = w.ActivityLogId left join ItemStatus i on i.StatusId = w.ItemStatus
我总是倾向于从在 sql 语句中返回的所有表中获取所有列,即使我将它映射到 ActivityLog 表也是如此。我也在做分页,如下代码所示:
ICriteria crit = nhelper.NHibernateSession.CreateCriteria(typeof(Model.ActivityLog), "a").CreateAlias("a.WallPosts", "w",CriteriaSpecification.LeftJoin)
.CreateAlias("w.ItemStatus", "i", CriteriaSpecification.LeftJoin)
.SetMaxResults(pageSize).SetFirstResult(startRow).AddOrder(Order.Desc("a.Date"));
谢谢
H
【问题讨论】:
【参考方案1】:听起来您在映射文件中将延迟加载设置为 false,这意味着所有关联和子集合也正在加载。你能验证一下吗?
【讨论】:
休眠转换器 - 检查 distinctrootentity 转换器 试过它确实得到了独特的结果,但它会影响分页,因为如果有重复,那么它会返回较低的结果,那么它应该【参考方案2】:您问“如何使用 NHibernate CreateQuery 选择一个表”(HQL)。在这种情况下,您可以使用 select 选择要获取的内容。
在您的文本中,您使用的是标准。 AFAIK,您无法直接控制要阅读的列。但是,如果您为连接创建 DetachedCriteria,则不会获取它。
【讨论】:
是的,只是改变了这一点。您有如何实现这一目标的示例吗? select a from ActivityLog a left join a.WallPosts w left join w.ItemStatus i order by a.Date skip 4 take 10 ...skip 和 take 的数字(当然)用于分页。 谢谢,是否可以在不使用 CreateQuery 的情况下执行此操作,因为我必须生成一个相当复杂的 where 子句。我没有在这里包含它,因为它会使代码太长。 是的,正如我所写,如果您想控制获取哪些列,请使用 DetachedCriteria 进行连接。 nhforge.org/doc/nh/en/index.html#querycriteria-detachedqueries以上是关于如何使用 NHibernate CreateCriteria 选择一张表的主要内容,如果未能解决你的问题,请参考以下文章
NHibernate - 如何使用 where 子句保存对象