带有子查询的休眠标准

Posted

技术标签:

【中文标题】带有子查询的休眠标准【英文标题】:Nhibernate critera with subquery 【发布时间】:2017-05-18 12:22:33 【问题描述】:

我想帮助在 nhibernate 中使用 critera api 创建这个查询(从 sql 中删除了不必要的部分):

SELECT this_.ID as ID120_1 FROM SS10_FOLDER this_ 
where this_.id in (select folderacce1_.resource_id from SS10_FOLDER_ACCESS folderacce1_ WHERE folderacce1_.GROUP_ID in (6174,6155));

我当前的解决方案使用“内部连接”,但我想避免它并使用上面 sql 中的“in select”。 “groupIds”是 c# 中的 id 列表。

var critiera = _session.CreateCriteria<H>();
criteria.CreateCriteria("Access", NHibernate.SqlCommand.JoinType.InnerJoin).Add(NHibernate.Criterion.Restrictions.In("Group.Id", groupIds));

【问题讨论】:

【参考方案1】:

这样解决:

DetachedCriteria subQuery = DetachedCriteria.For<A>("Access")
                .Add(NHibernate.Criterion.Restrictions.In("Access.Group.Id", SmartContext.Current.GetGroupIds(Session).ToList())).SetProjection(Projections.Property("Access.Resource.Id"));

criteria.Add(Subqueries.PropertyIn("Id", subQuery));

【讨论】:

以上是关于带有子查询的休眠标准的主要内容,如果未能解决你的问题,请参考以下文章

带有两个子查询/连接的 JPA 标准选择

休眠条件中的子选择

如何在休眠子查询中同时使用行号和顺序?

使用公式休眠@OneToOne - 列不能外连接到子查询

在连接的子查询中重复 WHERE 标准

JPA 2.0、标准 API、子查询、表达式中