Query.list() 与 Query.iterator() 区别
来源:互联网 发布:linux所有版本网站 编辑:程序博客网 时间:2024/05/02 02:52
iterator()方法的出现主要是为了解决查询是的性能问题。例如下面使用list()方法取得对象的代码:
........//打开Session,开启事务
Query q = session.createQuery("from Student");
//以下为查询在name中"t"字符的所以学生
q = session.createQuery("from Student s where s.name like 't%'");
q.list();
........//提交事务,关闭 session
运行以上代码,得到的控制台信息如下:
Hibernate : select s.* from student s
Hibernate : select s.* from student s where s.name like 't%'
第2条select 语句查找所以匹配条件的对象,然后根据起id值到Session缓寸中查找这个对象是否已经存在,如果已经存在,则返回缓存中这个对象的引用,不再重新组装对象。因此select * 是不必要的,只需要select s.id 即可。
Query接口的iterator()方法发送select 语句检索id字段,然后根据id 值在Session缓存和二级缓存中查找匹配的对象,如果存在,把它直接加到查询结果返回,如果不存在,根据刚才已经检索出来的id,执行额外的 select语句到数据库检索该对象。
Student表中共有两个Student对象,首先通过get()方法把一个Student对象加载到 Session缓存,然后再查询所有的Student对象,观察控制台的输出语句,如下代码所示:
.....//打开session,开启事务
stu = (Student) session.get(Student.class , new Integer(1));
Query q = session.createQuery("from Studnet");
Iterator it = q.iterator();
stu1 = (Student) it.next();
stu2 = (Student) it.next();
........//提交事务,关闭 session
运行以上代码,得到的控制台信息如下:
Hibernate : select s.* from student s where s.id = ?
Hibernate : select s.id from student s
Hibernate : select s.* from student s where s.id = ?
第1条select * 语句是由get()方法引起的,第2条select s.id 是由q.iterator()引起的(如果调用集合对象的iterator()方法,将会发送select * from table,比如team.getStudent().iterator()),第3条语句是因为在缓存中只存在一个Student对象,还有一个 Student对象必须发送SQL语句从数据库取得,然后再把它加入到session缓存中。
Query接口的iterator()方法和load()方法很相似,只不过load()用于加载单独的对象,而iterator()用于批量的加载。某 些情况下, 可以使用iterator()获得更好的性能。这通常用于预期返回的结果在Session,或二级缓存中(second-level cache)中已经存在时的情况。当缓存中的对象很少,或者iterator()查询的范围过于宽广时(比如HQL语句"from Student"),反而对性能造成不利的影响,因为iterator()方法第一次总是查询所有的id,然后根据id值一条一条地发送select 语句去取得对象,因此如果有有10000条记录,而且是在Session中是第一次查询时(缓存中还没有对象数据),则要发送10001条SQL语句去取 得数据,这样的话,还不如直接用以下语句来得方便高效。
........//打开Session,开启事务
Query q = session.createQuery("from Student");
//以下为查询在name中"t"字符的所以学生
q = session.createQuery("from Student s where s.name like 't%'");
q.list();
........//提交事务,关闭 session
运行以上代码,得到的控制台信息如下:
Hibernate : select s.* from student s
Hibernate : select s.* from student s where s.name like 't%'
第2条select 语句查找所以匹配条件的对象,然后根据起id值到Session缓寸中查找这个对象是否已经存在,如果已经存在,则返回缓存中这个对象的引用,不再重新组装对象。因此select * 是不必要的,只需要select s.id 即可。
Query接口的iterator()方法发送select 语句检索id字段,然后根据id 值在Session缓存和二级缓存中查找匹配的对象,如果存在,把它直接加到查询结果返回,如果不存在,根据刚才已经检索出来的id,执行额外的 select语句到数据库检索该对象。
Student表中共有两个Student对象,首先通过get()方法把一个Student对象加载到 Session缓存,然后再查询所有的Student对象,观察控制台的输出语句,如下代码所示:
.....//打开session,开启事务
stu = (Student) session.get(Student.class , new Integer(1));
Query q = session.createQuery("from Studnet");
Iterator it = q.iterator();
stu1 = (Student) it.next();
stu2 = (Student) it.next();
........//提交事务,关闭 session
运行以上代码,得到的控制台信息如下:
Hibernate : select s.* from student s where s.id = ?
Hibernate : select s.id from student s
Hibernate : select s.* from student s where s.id = ?
第1条select * 语句是由get()方法引起的,第2条select s.id 是由q.iterator()引起的(如果调用集合对象的iterator()方法,将会发送select * from table,比如team.getStudent().iterator()),第3条语句是因为在缓存中只存在一个Student对象,还有一个 Student对象必须发送SQL语句从数据库取得,然后再把它加入到session缓存中。
Query接口的iterator()方法和load()方法很相似,只不过load()用于加载单独的对象,而iterator()用于批量的加载。某 些情况下, 可以使用iterator()获得更好的性能。这通常用于预期返回的结果在Session,或二级缓存中(second-level cache)中已经存在时的情况。当缓存中的对象很少,或者iterator()查询的范围过于宽广时(比如HQL语句"from Student"),反而对性能造成不利的影响,因为iterator()方法第一次总是查询所有的id,然后根据id值一条一条地发送select 语句去取得对象,因此如果有有10000条记录,而且是在Session中是第一次查询时(缓存中还没有对象数据),则要发送10001条SQL语句去取 得数据,这样的话,还不如直接用以下语句来得方便高效。
- Query.list() 与 Query.iterator() 区别
- Hibernate中的query.list()与query.iterator()方法的区别
- Hibernate : Query.list()、Query.iterator()的区别
- Hibernate : Query.list()、Query.iterator()的区别
- Query.list()和Query.iterator()的区别
- Hibernate : Query.list()、Query.iterator()的区别
- Hibernate : Query.list()、Query.iterator()的区别
- Hibernate : Query.list()、Query.iterator()的区别
- Query类的中方法list()与iterator()的区别?
- hibernate-Query的list方法与iterator方法的区别
- Query接口中list()与iterator()查询的区别
- Hibernate中Query.list()和Query.iterator()的区别
- query的list和iterator区别
- query.uniqueresult() 与 query.list
- Hibernate:Query.list 与 Query.iterate 的区别
- hibernate的query.iterate()与query.list()的区别(四)
- Hibernate:Query接口中list和iterator区别
- hibernate Query中的list和iterator方法区别
- Symbian 资源文件解析
- ANALYSIS SERVER配置参数优化方案
- access按时间统计
- 12个常用的函数技巧
- 测试Hibernate中session的生命周期以及CRUD
- Query.list() 与 Query.iterator() 区别
- Access数据库的建立或压缩
- 补充Haaf's Game Engine 中关于vc6中的设置
- 机器狗源码(C的)
- spring 的scope
- 关于网页方面的问题
- 常用U-Boot命令
- 学习---解析#pragma指令
- 全球创新企业50强 苹果Google再度上位(2008-04-21)