15.16. 小技巧 & 小窍门
优质
小牛编辑
130浏览
2023-12-01
你可以统计查询结果的数目而不必实际的返回他们:
( (Integer) session.createQuery("select count(*) from ....").iterate().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
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 has getName() and getSize()
List foos = q.list();
通过将接口
Query
与一个过滤器(filter)一起使用,集合(Collections)是可以分页的:
Query q = s.createFilter( collection, "" ); // the trivial filter
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.createQuery("select count(*) from ....").iterate().next() ).intValue();