iterate:
String sql = "from Bigque where id <= 5";
String sql2 = "from Bigque where id <= 6";
BigqueDAO dao = new BigqueDAO();
Session session = dao.getSession();
Iterator<Bigque> it = session.createQuery(sql).iterate();
while(it.hasNext()){
System.out.println(it.next().getContent());
}
System.out.println("===========");
Iterator<Bigque> it2 = session.createQuery(sql2).iterate();
while(it2.hasNext()){
System.out.println(it2.next().getContent());
}
session.close();结果:
Hibernate: select bigque0_.ID as col_0_0_ from cloudroom.bigque bigque0_ where bigque0_.ID<=5
Hibernate: select bigque0_.ID as ID51_0_, bigque0_.Content as Content51_0_, bigque0_.SubjectID as SubjectID51_0_ from cloudroom.bigque bigque0_ where bigque0_.ID=?
选择题
Hibernate: select bigque0_.ID as ID51_0_, bigque0_.Content as Content51_0_, bigque0_.SubjectID as SubjectID51_0_ from cloudroom.bigque bigque0_ where bigque0_.ID=?
填空题
Hibernate: select bigque0_.ID as ID51_0_, bigque0_.Content as Content51_0_, bigque0_.SubjectID as SubjectID51_0_ from cloudroom.bigque bigque0_ where bigque0_.ID=?
阅读题
Hibernate: select bigque0_.ID as ID51_0_, bigque0_.Content as Content51_0_, bigque0_.SubjectID as SubjectID51_0_ from cloudroom.bigque bigque0_ where bigque0_.ID=?
判断题
Hibernate: select bigque0_.ID as ID51_0_, bigque0_.Content as Content51_0_, bigque0_.SubjectID as SubjectID51_0_ from cloudroom.bigque bigque0_ where bigque0_.ID=?
选择题
===========
Hibernate: select bigque0_.ID as col_0_0_ from cloudroom.bigque bigque0_ where bigque0_.ID<=6
选择题
填空题
阅读题
判断题
选择题
Hibernate: select bigque0_.ID as ID51_0_, bigque0_.Content as Content51_0_, bigque0_.SubjectID as SubjectID51_0_ from cloudroom.bigque bigque0_ where bigque0_.ID=?
填空题结论:
延迟加载 先发送一条sql语句获取所有的id 用到的时候再发送SQL去数据库查找每个对象
在一个session中两次iterate 第二个iterate还是会发送一条SQL获取id 用到的时候再发送SQL去数据库查找每个对象(如果session中有这个对象,就在缓存中查找,不发送SQL)
list:
String sql = "from Bigque where id <= 5";
// String sql2 = "from Bigque where id <= 6";
BigqueDAO dao = new BigqueDAO();
Session session = dao.getSession();
List<Bigque> list = session.createQuery(sql).list();
for(int i=0; i<list.size(); i++){
System.out.println(list.get(i).getContent());
}
System.out.println("=============");
List<Bigque> list2 = session.createQuery(sql).list();
for(int i=0; i<list2.size(); i++){
System.out.println(list2.get(i).getContent());
}
session.close();结果:Hibernate: select bigque0_.ID as ID51_, bigque0_.Content as Content51_, bigque0_.SubjectID as SubjectID51_ from cloudroom.bigque bigque0_ where bigque0_.ID<=5
选择题
填空题
阅读题
判断题
选择题
=============
Hibernate: select bigque0_.ID as ID51_, bigque0_.Content as Content51_, bigque0_.SubjectID as SubjectID51_ from cloudroom.bigque bigque0_ where bigque0_.ID<=5
选择题
填空题
阅读题
判断题
选择题结论:list取所有 第二次发出仍会到数据库查找
本文通过对比iterate与list方法,详细解析了Hibernate中的延迟加载机制。使用iterate时,Hibernate仅先发送获取所有ID的SQL,待实际需要数据时再逐条查询;而list则一次性加载所有数据。文章通过具体代码示例展示了不同加载方式对数据库查询的影响。
1057

被折叠的 条评论
为什么被折叠?



