Hibernate Query借口的iterate方法 查询缓存的问题。
iterate()方法查询一级缓存吗?
在我机器上测试,怎么不查询一级缓存呢?
Java code
@Test
public void testIterate() {
Session s = sf.getCurrentSession();
s.beginTransaction();
Query q = s.createQuery("from Category");
Iterator<Category> it = q.iterate();
while (it.hasNext()) {
Category c = it.next();
System.out.println(c.getId());
}
it = q.iterate();
while (it.hasNext()) {
Category c = it.next();
System.out.println(c.getId());
}
s.getTransaction().commit();
}
结果
Hibernate:
select
category0_.id as col_0_0_
from
Category category0_
1
2
3
4
5
6
7
8
9
10
Hibernate:
select
category0_.id as col_0_0_
from
Category category0_
1
2
3
4
5
6
7
8
9
10
为什么不查询一级缓存呢?
不是说list 和 iterate 方法有一个区别就是iterate查询缓存吗?
------解决方案--------------------
iterate分两个步骤加载数据
1.查询出所有符合数据的ID,此步骤无法利用缓存,所以就会出现你看靠的多次select id from category;
2.当你真正访问实体属性时执行select * from Category where id=? 此步骤可以利用一级缓存,前提是这个实体已经加载到内存中,如果内存中不存在则需要发起查询,反之不需要....这就是所谓的利用缓存..