学习之路-抓取策略

本文详细介绍了Hibernate中三种主要的抓取策略:查询抓取、连接抓取和子查询抓取,并提供了每种策略的使用场景及示例代码。

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

一、什么是抓取策略

*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="")
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值