hibernate 查询与连接 (接上篇)
2006-12-26 17:12
274 查看
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"
先外连接,再通过配置文件读取出其下的子类。(这点,我不太懂)
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"
先外连接,再通过配置文件读取出其下的子类。(这点,我不太懂)
相关文章推荐
- hibernate 实现多表连接查询
- hibernate 实现多表连接查询(转载)
- hibernate多张表连接查询
- 通过hibernate session.connection()获得数据库连接时,导致的查询缓慢甚至假死机问题
- hibernate学习系列-----(4)hibernate基本查询上篇:HQL基本查询
- 【Hibernate步步为营】--hql连接查询及外置命名查询
- Hibernate Criteria查询之多表连接分页-2【分页封装】
- hibernate 实现多表连接查询 查询结果映射到自定义类中
- hibernate连接查询总结
- SpringBoot入门-6(利用jpa连接hibernate,并进行生成表,对表的增加,删除,查询操作)
- hibernate处理多表连接查询
- hibernate连接mysql数据库查询数据报错
- hibernate连接查询总结
- hibernate 实现多表连接查询
- Hibernate Criteria查询之多表连接分页-下载连接
- 【hibernate多表连接 查询的解决方案】
- hibernate 实现多表连接查询(转载)
- hibernate hql 连接查询
- hibernate查询时报错关闭的连接