🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 14.15\. 小技巧 & 小窍门 你可以统计查询结果的数目而不必实际的返回他们: ``` ( (Integer) session.iterate("select count(*) from ....").next() ).intValue() ``` 若想根据一个集合的大小来进行排序,可以使用如下的语句: ``` 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子句中为选择的大小(selection size)指定一个条件: ``` from User usr where size(usr.messages) >= 1 ``` 如果你的数据库不支持子选择语句,使用下面的查询: ``` select usr.id, usr.name from User usr.name join usr.messages msg group by usr.id, usr.name having count(msg) >= 1 ``` 因为内连接(inner join)的原因,这个解决方案不能返回含有零个信息的`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 ``` JavaBean的属性可以被绑定到一个命名查询(named query)的参数上: ``` Query q = s.createQuery("from foo Foo as foo where foo.name=:name and foo.size=:size"); q.setProperties(fooBean); // fooBean包含方法getName()与getSize() List foos = q.list(); ``` 通过将接口`Query`与一个过滤器(filter)一起使用,集合(Collections)是可以分页的: ``` Query q = s.createFilter( collection, "" ); // 一个简单的过滤器 q.setMaxResults(PAGE_SIZE); q.setFirstResult(PAGE_SIZE * pageNumber); List page = q.list(); ``` 通过使用查询过滤器(query filter)可以将集合(Collection)的原素分组或排序: ``` Collection orderedCollection = s.filter( collection, "order by this.amount" ); Collection counts = s.filter( collection, "select this.type, count(this) group by this.type" ); ``` 不用通过初始化,你就可以知道一个集合(Collection)的大小: ``` ( (Integer) session.iterate("select count(*) from ....").next() ).intValue(); ```