Nhibernate 将HQL查询转换为条件会生成无效的SQL
我正在尝试将以下HQL查询转换为条件Nhibernate 将HQL查询转换为条件会生成无效的SQL,nhibernate,Nhibernate,我正在尝试将以下HQL查询转换为条件 from SubportfolioAudit as a where a.ID in (select max(a2.ID) from SubportfolioAudit as a2 where a2.EffectiveDate = :EffectiveDate and a.Subportfolio.ID = a2.Subportfolio.ID
from SubportfolioAudit as a
where a.ID in (select max(a2.ID)
from SubportfolioAudit as a2
where a2.EffectiveDate = :EffectiveDate
and a.Subportfolio.ID = a2.Subportfolio.ID
group by a2.Subportfolio.ID)
and a.Subportfolio.ID in (:SubportfolioList)
到目前为止,我有以下几点:
var crit = Session.CreateCriteria(typeof(SubportfolioAudit));
var currentAuditByEffectiveDate = DetachedCriteria.For(typeof(SubportfolioAudit))
.SetProjection(Projections.ProjectionList()
.Add(Projections.Max("ID"))
.Add(Projections.GroupProperty("Subportfolio.ID")))
.Add(Expression.Eq("EffectiveDate", effectiveDate));
crit.Add(Subqueries.PropertyIn("ID", currentAuditByEffectiveDate));
crit.Add(Expression.In("Subportfolio.ID", subportfolioList.Select(x => x.ID).ToArray()));
return crit.List<SubportfolioAudit>();
我知道Projections.GroupProperty()导致了这个问题,但我似乎无法找到另一种方法来实现我想要的。我相信(如果我错了,请纠正我)子查询是无效的,因为您缺少在HQL中设置的第二个where子句(…和a.Subportfolio.ID=a2.Subportfolio.ID)
我相信(无法验证,因为我无法测试您的代码)按照下面的方式转换您的条件查询会成功
var crit = Session.CreateCriteria(typeof(SubportfolioAudit), "mainQuery");
var currentAuditByEffectiveDate = DetachedCriteria.For(typeof(SubportfolioAudit),"subQuery")
.SetProjection(Projections.ProjectionList()
.Add(Projections.Max("ID"))
.Add(Projections.GroupProperty("Subportfolio.ID")))
.Add(Expression.Eq("EffectiveDate", effectiveDate));
.Add(Expression.EqProperty("subQuery.ID", "mainQuery.ID"));
crit.Add(Subqueries.PropertyIn("mainQuery.ID", currentAuditByEffectiveDate));
crit.Add(Expression.In("mainQuery.Subportfolio.ID", subportfolioList.Select(x => x.ID).ToArray()));
return crit.List<SubportfolioAudit>();
var crit=Session.CreateCriteria(typeof(SubportfolioAudit),“mainQuery”);
var currentAuditByEffectiveDate=DetachedCriteria.For(typeof(SubportfolioAudit),“subQuery”)
.SetProjection(Projections.ProjectionList()项目)
.Add(Projections.Max(“ID”))
.Add(projects.GroupProperty(“Subportfolio.ID”))
.Add(Expression.Eq(“EffectiveDate”,EffectiveDate));
.Add(Expression.EqProperty(“subQuery.ID”、“mainQuery.ID”);
添加(subquerys.PropertyIn(“mainQuery.ID”,currentAuditByEffectiveDate));
Add(Expression.In(“mainQuery.Subportfolio.ID”,subportfolioList.Select(x=>x.ID.ToArray());
返回crit.List();
我所做的是在DetachedCriteria中添加一个额外的where子句,该子句将子查询的SubportfoliAudit.ID列与外部主查询“连接”。我还提供了别名来命名查询 但是你为什么要设置Projections.Max(“ID”)?是的,你的代码也会产生同样的问题。基本上,子查询返回两列,这两列在in语句中使用,这是无效的。它必须完全删除group属性,但无论如何都不需要。谢谢你是对的。我相信您最初的标准代码有一个问题,我的解决方案解决了这个问题,但它与您请求帮助的问题不同。对不起。。。尽管如此,当通过ICriteria/DetachedCriteria接口使用时,NHibernate将在select语句中添加GroupBy列。我相信这是没有办法的。我希望我错了。
var crit = Session.CreateCriteria(typeof(SubportfolioAudit), "mainQuery");
var currentAuditByEffectiveDate = DetachedCriteria.For(typeof(SubportfolioAudit),"subQuery")
.SetProjection(Projections.ProjectionList()
.Add(Projections.Max("ID"))
.Add(Projections.GroupProperty("Subportfolio.ID")))
.Add(Expression.Eq("EffectiveDate", effectiveDate));
.Add(Expression.EqProperty("subQuery.ID", "mainQuery.ID"));
crit.Add(Subqueries.PropertyIn("mainQuery.ID", currentAuditByEffectiveDate));
crit.Add(Expression.In("mainQuery.Subportfolio.ID", subportfolioList.Select(x => x.ID).ToArray()));
return crit.List<SubportfolioAudit>();