你可以计算查询结果数而不用真正返回结果集:
int count = (int) session.CreateQuery("select count(*) from ....").UniqueResult();
通过集合大小排序结果,可以使用以下查询:
select usr.id, usr.Name
from User as usr
left join usr.Messages as msg
group by usr.id, usr.Name
order by count(msg)
如果你的数据库支持子查询,你可以在你的查询的where从句中放置一个基于选集大小的条件:
from User usr where size(usr.Messages) >= 1
如果你的数据库不支持子查询,使用以下查询:
select usr.id, usr.Name
from User usr
join usr.Messages msg
group by usr.id, usr.Name
having count(msg) >= 1
由于innerjoin该解决方案不能返回一个没有message的User,所以下述形式的查询更有用:
select usr.id, usr.Name
from User as usr
left join usr.Messages as msg
group by usr.id, usr.Name
having count(msg) = 0
一个对象的属性可以被绑定到命名查询参数:
IQuery q = s.CreateQuery("from foo in class Foo where foo.Name=:Name and foo.Size=:Size");
q.SetProperties(fooBean); // fooBean has properties Name and Size
IList foos = q.List();
使用带过滤器的IQuery接口可以为集合分页:
IQuery q = s.CreateFilter( collection, "" ); // the trivial filter
q.setMaxResults(PageSize);
q.setFirstResult(PageSize * pageNumber);
IList page = q.List();
使用查询过滤器可以为集合元素排序:
ICollection orderedCollection = s.Filter( collection, "order by this.Amount" );
ICollection counts = s.Filter( collection, "select this.Type, count(this) group by this.Type" );