当创建查询Query后,
首先不讨论它们利用缓存的时候:
如果调用它的 list方法,将一次性把所查询的所有满足查询条件的结果都将取出组合成list集合放入内存,因此只用一条sql语句。但如果符合查询条件的结果很大时则容易造成内存益处。
如果调用它的iterate方法,此时暂时也只执行一条sql语句,该sql语句用来查询出所有满足查询条件的结果的id,即唯一标识符,将它们组成一个集合,而不会查询出结果记录的其他字段值。而当我们实际开始迭代该结果集时,每迭代一次,就根据正迭代结果的标识符再产生一条sql语句从数据库中取出相应的数据。因此这样有多少个结果就会产生多少条sql语句,如果再加上最开始查询id的sql语句,则如果结果集为n,则产生的sql语句为n+1条。如果当结果集很大时也可能产生内存益处,因此我们可以迭代一个元素后立即将其从缓存中删除(包括两级缓存),这样我们就可以缓解一下结果集比较大的情况,当然如果查询出的id集合足够大也同样会造成内存益处。
然后再来考虑它们利用缓存的情况:
list只能利用一级缓存,不能利用二级缓存,因此如果一级缓存中已经存在符合查询条件的结果则不再从数据库中取。
iterate可以利用一级和二级缓存,因此如果它们中已经存在符合查询条件的结果则不再从数据库中取。
有时候我们需要混合使用它们两,当我们第一次取值或需要修改值时可以利用list,这样可以减少sql语句执行的条数,而其他情况则可以使用iterate,因为可以充分利用缓存。
分享到:
相关推荐
2. `iterate`方法:与`list`不同,`iterate`方法按需加载数据,它返回一个迭代器,每次调用`next()`方法时才会从数据库中获取一条记录。这种方式降低了内存消耗,尤其适合处理大量数据。但缺点是需要更多的数据库...
### HIBERNATE_QUERY知识点详解 ...List<Cat> blueCats = query.list(); ``` 以上就是关于Hibernate查询机制的相关知识点介绍,通过这些方法和技术,开发者可以根据具体的应用需求选择最合适的查询方式。
提供的源码`s2sh_relation23_list_iterate`可能包含了演示如何使用Hibernate进行查询和遍历结果的实例。通过阅读和运行这些代码,你可以深入理解`list()`和`iterator()`在实际项目中的应用。 总之,理解和掌握`...
4. **执行查询**:调用Query对象的list或iterate方法获取结果。 5. **返回List集合**:Query.list() 返回List集合,Query.iterate() 返回Iterator。 - **Query.list()** 和 **Query.iterate()** 的主要区别在于返回...
List<Customer> customers = query.list(); ``` ##### 4. QBC方式(Query By Criteria) - **定义**:QBC是Hibernate提供的另一种查询方式,基于标准的Java API,提供了更多的灵活性。 - **应用场景**:构建复杂...
该方法用于关闭迭代器,该迭代器是通过iterate方法创建的。该方法可以确保迭代器资源的释放。 contains方法 该方法用于检查指定对象是否在Session缓存中。如果对象在缓存中,该方法返回true,否则返回false。 ...
这两个方法都用于执行HQL(Hibernate Query Language)查询。`find`返回一个List集合,一次性将所有结果加载到内存,适合于小规模数据的查询。而`iterate`返回一个迭代器,每次调用`next()`方法时才从数据库中获取一...
`getHibernateTemplate()`是Spring框架与Hibernate集成时提供的一个便捷方法,它封装了对Hibernate Session的操作,使得在Service或DAO层进行数据库交互变得更加简单。 在给定的标题和描述中,提到的是`...
List<Role> list = query.list(); session.close(); return list; } } ``` 3. **Struts配置** - 在`struts-config.xml`中定义Action映射和结果页面。 - 使用Struts标签库进行页面逻辑控制和数据展示。 ...
Query 对象提供了许多方法来查询持久化对象,例如 list、iterate 等。Query 对象可以根据不同的条件来查询持久化对象。 Hibernate 的核心接口分别是 Configuration、SessionFactory、Session、Transaction 和 Query...
Hibernate 二级缓存是针对SessionFactory级别的全局缓存,与一级缓存(Session级别)不同,一级缓存只在单个Session生命周期内有效。二级缓存则允许不同Session之间共享数据,提高了数据访问效率,减少了对数据库的...
`单端代理的批量抓取.PNG` 可能讲解了如何通过Hibernate的批处理技术提高性能,如设置批处理大小,利用Session的flush模式,以及Query的iterate()和list()方法的区别。批量操作可以减少数据库交互次数,提升应用性能...
Iterator iter = query.iterate(); while(iter.hasNext()){ Object[] objs = (Object[])iter.next(); for (int i = 0; i ; i++) { System.out.print(objs[i]); } System.out.println(); } ``` 如果你想将查询...
一.使用Hibernate的Session对象操作数据库 1.初始化Hibernate:在要使用Hibernate的类的方法中实例化... (7).createQuery(String HQL).list()/iterate()/uniqueResult(); //HQL(Hibernate Query Language)语句查询
不过,值得注意的是,list操作不会直接使用缓存,而iterate操作会先从数据库获取ID,然后逐个load,如果对象在缓存中存在,就直接从缓存读取,否则从数据库加载。对于读写缓存,我们需要在映射文件中配置`...
例如,当你使用`list`、`load`或`iterate`方法获取对象时,它们会被放入缓存。不过,`list`操作不会利用缓存,而`iterate`会先查询ID,然后逐个从缓存或数据库中加载对象。 在Ehcache的配置中,你可以定义每个缓存...
- 执行`save()`、`update()`、`saveOrUpdate()`等操作时,如果使用`load()`、`get()`、`list()`、`iterate()`等方法,则可能会触发缓存的刷新。 - 在调用`flush()`方法时,会将Session内的状态同步到数据库,并且...
- **查询**:使用`get()`、`load()`或查询接口的`list()`、`iterate()`、`filter()`等方法,如果对象不在缓存中,则从数据库加载后存储于缓存。 - **清除**:可以使用`evict(Object obj)`从缓存中移除特定对象,或...