学习之路-抓取策略

来源:互联网 发布:png转ico软件 编辑:程序博客网 时间:2024/06/06 15:51

一、什么是抓取策略

*Hibernate如何获取主体对象的关联属性的策略。
*抓取策略可以在ORM映射文件中声明,也可以在特定的HQL 或条件查询(Criteria Query)中重载声明


二、分类

*查询抓取(fetch=“select”)
  当关联属性为延迟加载时,如需加载将另外发送一条SELECT语句抓取当前对象的关联实体或集合。

<many-to-one name="dept" class="Dept" fetch="select"> 默认为select,有join可选

测试代码:

Employee emp=(Employee)session.get(Employee.class, 1001);
Dept dept=emp.getDept();
System.out.println(dept.getDept_name());

注:上述代码中,当调用get方法时,发送一条查询emp的sql语句,而关联属性Dept没有加载出来,即没有发送sql语句查询,当我调用Dept的非主键属性时发送了一条sql语句查询Dept。



*连接抓取(fetch=“join”)
当在关联属性映射中将fetch设置为join时,在执行get()和load()方法时Hibernate会通过内连接立即获取关联属性。此时会导致关联属性的延迟加载失效(仅仅针对get和load方法,对HQL和Criteria无效)。

<many-to-one name="dept" class="Dept" fetch="join"> 默认为select,有join可选

测试代码:

Employee emp=(Employee)session.get(Employee.class, 1001);
Dept dept=emp.getDept();
System.out.println(dept.getDept_name());

注:上述代码中,当我调用get方法时,会通过左外连接查询把关联属性Dept给查出来,下面是查询语句:

Hibernate: 
    select
        employee0_.e_no as e_no1_1_0_,
        employee0_.e_name as e_name2_1_0_,
        employee0_.e_gender as e_gender3_1_0_,
        employee0_.e_job as e_job4_1_0_,
        employee0_.e_salary as e_salary5_1_0_,
        employee0_.hireDate as hireDate6_1_0_,
        employee0_.dept_no as dept_no7_1_0_,
        dept1_.d_no as d_no1_0_1_,
        dept1_.d_name as d_name2_0_1_,
        dept1_.d_location as d_locati3_0_1_ 
    from
        EMPLOYEE employee0_ 
    left outer join
        DEPT dept1_ 
            on employee0_.dept_no=dept1_.d_no 
    where
        employee0_.e_no=?



*子查询抓取(fetch=“subselect”)

当获取集合关联属性时,另外发送一条查询语句或者子查询语句抓取集合关联属性。此设置针对HQL语句同样有效

<set name="emp" inverse="true" fetch="subselect"> fetch默认为select,还有join、subselect可选

测试代码:

Dept dept=(Dept)session.get(Dept.class, 10);
Set<Employee> emps=dept.getEmp();
int count=emps.size();

注:上述代码中,当我调用size方法时,发送一条sql语句查询主题对象的关联属性Set



 *批量抓取(batch-size="")
















原创粉丝点击