您的位置:首页 > Web前端

Hibernate 抓取策略Fetch

2016-09-24 12:29 323 查看
lazy与fetch
如果fetch为"join",lazy不论设置成什么样的值,都不起作用
如果fetch为"select",先加载classes,再加载student,而lazy决定在什么时候加载student


public class FetchTest  extends HibernateUtil{

/**
* 1.把classes表中所有的数据查询出来
* 2.再根据每一个CID,去student表中查询
* 抓取策略默认值是select,n+1sql语句
*  <set name="students" inverse="true" fetch="select">
* */
@Test
public void getAllClassesAndStudents(){
Session session=sessionFactory.openSession();
List<Classes> classes=session.createQuery("from com.sanmao.utils.Classes").list();
for (Classes c: classes) {
Set<Student> students=c.getStudents();
for (Student s: students) {
System.out.println(s);
}
}
}
/**
*  <set name="students" inverse="true" fetch="subselect">
*
* select * from Student where cid in (select cid from Classes )
调用了子查询
但是这种策略,在一定程度上也不能使用,在不包含子查询的需求内
例如 查询CID为1 的班级的所有学生,就不能用子查询了
*/
@Test
public void getAllClassesAndStudents_SubSelect(){
Session session=sessionFactory.openSession();
List<Classes> classes=session.createQuery("from com.sanmao.utils.Classes").list();
for (Classes c: classes) {
Set<Student> students=c.getStudents();
for (Student s: students) {
System.out.println(s);
}
}
}

/**
* <set name="students" inverse="true" fetch="join">
* 在包含子查询的查询中,用join 无效,和默认select效果一样
* 在不包含子查询的查询中 ,join能实现优化
* 所有万能select(效率低),包含子查询用subselect,不包含用join
* */
@Test
public void getAllClassesAndStudents_Join(){
Session session=sessionFactory.openSession();
List<Classes> classes=session.createQuery("from com.sanmao.utils.Classes").list();
for (Classes c: classes) {
Set<Student> students=c.getStudents();
for (Student s: students) {
System.out.println(s);
}
}
}
/**
* select c  from Classes  left outer join  Student
on classes0_.cid=students1_.cid
where
classes0_.cid=?
* */
@Test
public void getAllClassesAndStudents_Join2(){
Session session=sessionFactory.openSession();
Classes c=(Classes) session.get(Classes.class,1L);
Set<Student> students=c.getStudents();
for (Student s: students) {
System.out.println(s);
}
session.close();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息