本问将介绍
* 使用别名查询
* 分页查询
* 排序
* 检索单个对象
* 按主键逐个查询
* 对滚动结果集查询
首先介绍下别名的几个方式
分页查询
排序
1: HQL 使用order by 子句进行查询
2: QBC利用Order类排序
检索单个对象
*Query接口和Criteria接口都提供了list()方法返回一个List类型的查询结果 list中存放了满足查询条件的持久化对象
*uniqueResult()方法则返回一个对象。
按主键逐个处理结果(iterte()方法)
当每次通过调用iterCus.next()的时候,该方法先到session的缓存以及二级缓存(在已经开启的情况下)查看是否存在特定的OID的Customer对象,如果存在则直接返回对象,否则就通过相应的SQL进行查询。
在这个中因为首先查询的是OID所以在缓存中如果不存在相应的持久化的对象的时候就会没执行一次next就会发出一条SQL,这就是我们所说的N+1问题。
但是在一下的情况下可以考虑使用iterate()
* customer表中存在大量的字段(此时只有加载OID就可以节省内存)
* 启用了二级缓存(那就可能已经存在直接取就比较快)
在iterate()遍历的是时候Iterator一直处于打开的状态,因此在以下的情况下被关闭
* 遍历完所有对象之后
* 关闭session对象
* 通过org,hibernate.Hibernate.close(itertor)方法关闭对象
可滚动结果集
Query Criteria接口都提供了可滚动结果集的方法scroll()