NHibernate:hql到条件查询 – 需要帮助

我有这个hql查询,完美的工作:

select m from Media m join m.Productlines p join m.Categories c join m.Spaces sp join m.Solutions so where m.Uid != 0 and p.Uid in (:productlines) and c.Uid in (13) and sp.Uid in (52) and so.Uid in (15,18) group by m.Uid 

但现在它需要参数化/制作动态,不仅是参数,还有连接(可以只从Media中选择,没有任何连接,因此在这种情况下不需要* .Uid)。

我不想乱用一个StringBuilder实例并以这种方式构建hql查询,我宁愿使用Criteria API,但我不能得到一个

 SELECT m.* .... GROUP BY m.Uid 

查询以使用Criteria。

如果我添加一个

 Projections.GroupProperty("Uid") 

我的查询,nhibernate选择

 SELECT m.Uid .... GROUP BY m.Uid 

这当然是错的。

之后,我还需要计算查询返回的唯一行,因为结果是分页的。

所以,我的其他查询非常相似,但我找不到相应的Criteria

 SELECT COUNT(DISTINCT m.Uid) 

这是HQL:

  select count(distinct m.Uid) from Media m join m.Productlines p join m.Categories c join m.Spaces sp join m.Solutions so where m.Uid != 0 and p.Uid in (:productlines) and c.Uid in (13) and sp.Uid in (52) and so.Uid in (15,18) 

如何使用Criteria API完成此操作?

请,(N)Hibernate专家 – 帮助我,我找不到一个有效的解决方案。 任何帮助是极大的赞赏!

组结果列隐式返回组列,但您可以添加更多列。 AFAIK,您可以返回完整的实体:

 var query = session.CreateCriteria(typeof(Media), "m") .Add(Projections.GroupProperty("m")) .Add(Restrictions.NotEq("m.Uid", 0)); // dynamically add filters if (filterProductLines) { query .CreateCriteria("m.Productlines", "p") .Add(Restrictions.Eq("p.Uid", productLines)); } // more dynamic filters of this kind follow here... IList results = query.List(); 

要计算完整数量的结果,您可以使用不同的投影构建相同的查询:

 var query = session.CreateCriteria(typeof(Media), "m") .SetProjection(Projections.CountDistinct("m.Uid")); // rest of the query the same way as above long totalNumberOfResults = query.UniqueResult(); 

我对Projections.GroupProperty("m")不确定,你需要试试这个。 如果它不起作用,你可以使它成为仅返回id的DetachedQuery:

 var subquery = DetachedCriteria.For(typeof(Media), "m") .Add(Projections.GroupProperty("m.Uid")) .Add(Restrictions.NotEq("m.Uid", 0)); // add filtering var query = session.CreateCriteria(typeof(Media), "outer") .Add(Subqueries.PropertyIn("outer.Uid", subquery)); IList results = query.List(); 

这会创建一个像这样的SQL查询:

 select outer.* // all properties of Media to create an instance from Media outer where outer.Uid in ( select Uid from media m where // filter ) 
 var count = session.CreateCriteria(typeof(Media)) // Add other criterias... .SetProjection(Projections.CountDistinct("Id")) // or whatever the id property of Media class is called .UniqueResult(); 

至于你的GROUP BY问题,查询:

 SELECT m.* .... GROUP BY m.Uid 

没有意义,因为您只需要选择group by子句或聚合函数中出现的列。 你能详细说明一下你想要达到的目的是什么吗?