Hibernate : Query.list()、Query.iterator()的区别

来源:互联网 发布:有什么虚拟光驱软件 编辑:程序博客网 时间:2024/05/18 02:01

Query上有list()iterator()方法,两者的差别在于list()方法在读取数据时,并不会利用到快取,而是直接再向数据库查询,而iterator()则将读取到的数据写到快取,并于读取时再次利用。

来看看下面的程序:

Session session =sessionFactory.openSession();
       
 
Query query = session.createQuery("from User");
List users = query.list();
users = query.list();

session.close();


这个程序片段会使用两次SQL来查询数据库:

Hibernate: select user0_.id as id,user0_.name as name0_, user0_.age as age0_ from user user0_
Hibernate: select user0_.id as id, user0_.name as name0_, user0_.age as age0_from user user0_


如果在Session关闭之前,要再将所有数据在取出,可以使用iterator()方法,例如:

Session session =sessionFactory.openSession();

Query query = session.createQuery("from User");
Iterator users = query.iterate();
users = query.iterate();

session.close();


这个程序片段会使用一次SQL向数据库查询,第二次则直接从快取中取得数据:

Hibernate: select user0_.id as col_0_0_from user user0_


由于使用iterator()方法时会使用到Session level快取,所以在查询大量数据时,会耗用大量的内存,必要时可以使用Sessionevict()clear()方法来清除快取。

原创粉丝点击