hibernate 查询与连接 (接上篇)

本文详细解释了Hibernate框架中Fetch与Lazy两种加载策略的区别,包括它们如何影响SQL查询的生成,以及在不同场景下如何选择合适的加载策略来优化应用程序性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、fetch实质上就是立即加载lazy="false"
2、
Team.hbm.xml
  <set name="students" inverse="true" fetch="join" lazy="true">
   <key column="team_id" />
   <one-to-many class="model.Student" />
  </set>
当session.get(Team.class,"112457458744");即取得一个Team对象时,
如果在<set name="students" inverse="true" fetch="join" lazy="true">
中设置了预先抓取,即fetch="join"后,则会自动抓取其子类Students的集合。
如果没有fetch="join",则只是取得当前对象Team
3、fetch="join"只是在session.get()或session.load();里才立即加载其所配置为fetch="join"的集合。对于上例是students
如果,为from Team t 则不起作用。只是输出一条select * from Team t;不加载students集合。
如果,为from Team t left join t.students 则对象间没有关系,所以会生成数组将每个select 出来的对象写入数组中。当作元素。
如果,为from Team t left join fetch t.students 则当取得每一个符合条件的Team时会立即加载每个Team的students集合。
 这时,
 list teamList ;
 form () {
  Team team = (Team) list.get(i);
  Set stuSet = team.  ;
 }

 附:fetch与lazy的比较:

如果 Student没有为Cer设置立即加载,也没有设置fetch="join"

 如果Team为其子类Student设置了立即加载lazy="false",则

  只输出两条sql:一条是Team,一条是Student通过与Certificate表外连接同时取得Student所对应的certificate。

  sql1--> Hibernate: select team0_.id as id0_, team0_.teamName as teamName2_0_ from team team0_ where team0_.id=?
  sql2--> Hibernate: select students0_.team_id as team5_2_, students0_.id as id2_, students0_.id as id1_, students0_.cardId as cardId0_1_, students0_.name as name0_1_, students0_.age as age0_1_, students0_.team_id as team5_0_1_, certificat1_.id as id0_, certificat1_.`describe` as describe2_1_0_ from student students0_ left outer join certificate certificat1_ on students0_.id=certificat1_.id where students0_.team_id=?


 如果Team为其子类Student设置了预先抓取fetch="join",则

  输出3条sql:
  sql1--> Hibernate: select team0_.id as id1_, team0_.teamName as teamName2_1_, students1_.team_id as team5_3_, students1_.id as id3_, students1_.id as id0_, students1_.cardId as cardId0_0_, students1_.name as name0_0_, students1_.age as age0_0_ from team team0_ left outer join student students1_ on team0_.id=students1_.team_id where team0_.id=?
  sql2--> Hibernate: select certificat0_.id as id1_, certificat0_.`describe` as describe2_1_1_, student1_.id as id0_, student1_.cardId as cardId0_0_, student1_.name as name0_0_, student1_.age as age0_0_ from certificate certificat0_ left outer join student student1_ on certificat0_.id=student1_.id where certificat0_.id=?
  sql3--> Hibernate: select certificat0_.id as id1_, certificat0_.`describe` as describe2_1_1_, student1_.id as id0_, student1_.cardId as cardId0_0_, student1_.name as name0_0_, student1_.age as age0_0_ from certificate certificat0_ left outer join student student1_ on certificat0_.id=student1_.id where certificat0_.id=?

总结:

lazy="false"

首先加载所要load()的对象本例为Team(1条sql语句)。

然后,用一条sql将与循环出来的每个Team与其下的所配置为lazy="false"的对象相关联的所有子类用外连接left join读取出来。

fetch="join"

先外连接,再通过配置文件读取出其下的子类。(这点,我不太懂)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值