Hibernate的检索策略案例详解

本文深入探讨了Hibernate的检索策略,包括立即检索和延迟检索,并通过实例展示了fetch属性设置为join、select和subselect时的不同效果。讨论了lazy属性如何影响检索行为,总结了各种设置下的SQL查询差异。

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

 

Hibernate的检索策略

一,立即检索

在映射文件中设置<hibernate-mapping

    package="cn.csdn.producets.domain" default-lazy="false">

    <class name="Customers" table="Customers" lazy=”false”>

    <set name="orders"  lazy="false">

 

二,延迟检索

设置lazy=”false”不采用延迟检索

<set name="orders"  lazy=”false”>

Customers c=(Customers) session.get(Customers.class, 2);

       System.out.println(c.getEmail());

运行结果:Hibernate: select customers0_.id as id0_0_, customers0_.realName as realName0_0_, customers0_.pass as pass0_0_, customers0_.sex as sex0_0_, customers0_.petName as petName0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_ from Customers customers0_ where customers0_.id=?

Hibernate: select orders0_.cid as cid0_1_, orders0_.id as id1_, orders0_.id as id1_0_, orders0_.number as number1_0_, orders0_.address as address1_0_, orders0_.phone as phone1_0_, orders0_.odate as odate1_0_, orders0_.sum as sum1_0_, orders0_.status as status1_0_, orders0_.cid as cid1_0_ from orders orders0_ where orders0_.cid=?

 

设置lazy=”true”采用延迟加载

<set name="orders"  lazy=”false”>

Customers c=(Customers) session.get(Customers.class, 2);

       System.out.println(c.getEmail());

 

 

运行结果:Hibernate: select customers0_.id as id0_0_, customers0_.realName as realName0_0_, customers0_.pass as pass0_0_, customers0_.sex as sex0_0_, customers0_.petName as petName0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_ from Customers customers0_ where customers0_.id=?

总结:采用懒加载是会少输出一条sql查询语句;

 

 

三,关联级别检索策略

一.Fech=”join”;

第一种测试方式:<set name="orders"  fetch="join" lazy=”true”>

Customers c=(Customers) session.get(Customers.class, 2);

       System.out.println(c.getEmail());

 

代码执行结果:

Hibernate: select customers0_.id as id0_1_, customers0_.realName as realName0_1_, customers0_.pass as pass0_1_, customers0_.sex as sex0_1_, customers0_.petName as petName0_1_, customers0_.email as email0_1_, customers0_.rdate as rdate0_1_, orders1_.cid as cid0_3_, orders1_.id as id3_, orders1_.id as id1_0_, orders1_.number as number1_0_, orders1_.address as address1_0_, orders1_.phone as phone1_0_, orders1_.odate as odate1_0_, orders1_.sum as sum1_0_, orders1_.status as status1_0_, orders1_.cid as cid1_0_ from Customers customers0_ left outer join orders orders1_ on customers0_.id=orders1_.cid where customers0_.id=?

可以从运行结果中得知:采用迫切左外链接

第二种测试方式:<set name="orders"  fetch="join" lazy=”false”>

Customers c=(Customers) session.get(Customers.class, 2);

       System.out.println(c.getEmail());

 

代码执行结果:

Hibernate: select customers0_.id as id0_1_, customers0_.realName as realName0_1_, customers0_.pass as pass0_1_, customers0_.sex as sex0_1_, customers0_.petName as petName0_1_, customers0_.email as email0_1_, customers0_.rdate as rdate0_1_, orders1_.cid as cid0_3_, orders1_.id as id3_, orders1_.id as id1_0_, orders1_.number as number1_0_, orders1_.address as address1_0_, orders1_.phone as phone1_0_, orders1_.odate as odate1_0_, orders1_.sum as sum1_0_, orders1_.status as status1_0_, orders1_.cid as cid1_0_ from Customers customers0_ left outer join orders orders1_ on customers0_.id=orders1_.cid where customers0_.id=?

可以从运行结果中得知:采用迫切左外链接

第三种测试方式:<set name="orders"  fetch="join" lazy=”extra”>

Customers c=(Customers) session.get(Customers.class, 2);

       System.out.println(c.getEmail());

 

代码执行结果:

Hibernate: select customers0_.id as id0_1_, customers0_.realName as realName0_1_, customers0_.pass as pass0_1_, customers0_.sex as sex0_1_, customers0_.petName as petName0_1_, customers0_.email as email0_1_, customers0_.rdate as rdate0_1_, orders1_.cid as cid0_3_, orders1_.id as id3_, orders1_.id as id1_0_, orders1_.number as number1_0_, orders1_.address as address1_0_, orders1_.phone as phone1_0_, orders1_.odate as odate1_0_, orders1_.sum as sum1_0_, orders1_.status as status1_0_, orders1_.cid as cid1_0_ from Customers customers0_ left outer join orders orders1_ on customers0_.id=orders1_.cid where customers0_.id=?

可以从运行结果中得知:采用迫切左外链接

 

总结:若把fech属性设置为join则lazy属性就不起作用

二.Fech=”select”

第一种测试方式:<set name="orders"  fetch="select" lazy=”true”>

Customers c=(Customers) session.get(Customers.class, 2);

       System.out.println(c.getEmail());

       System.out.println(c.getOrders().size());

   

运行结果:Hibernate: select customers0_.id as id0_0_, customers0_.realName as realName0_0_, customers0_.pass as pass0_0_, customers0_.sex as sex0_0_, customers0_.petName as petName0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_ from Customers customers0_ where customers0_.id=?

null

Hibernate: select orders0_.cid as cid0_1_, orders0_.id as id1_, orders0_.id as id1_0_, orders0_.number as number1_0_, orders0_.address as address1_0_, orders0_.phone as phone1_0_, orders0_.odate as odate1_0_, orders0_.sum as sum1_0_, orders0_.status as status1_0_, orders0_.cid as cid1_0_ from orders orders0_ where orders0_.cid=?

1结论:采用延迟加载;

 

 

 

第二种测试方式:<set name="orders"  fetch="select" lazy=”false”>

Customers c=(Customers) session.get(Customers.class, 2);

   

 

 

 

 

运行结果:Hibernate: select customers0_.id as id0_0_, customers0_.realName as realName0_0_, customers0_.pass as pass0_0_, customers0_.sex as sex0_0_, customers0_.petName as petName0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_ from Customers customers0_ where customers0_.id=?

Hibernate: select orders0_.cid as cid0_1_, orders0_.id as id1_, orders0_.id as id1_0_, orders0_.number as number1_0_, orders0_.address as address1_0_, orders0_.phone as phone1_0_, orders0_.odate as odate1_0_, orders0_.sum as sum1_0_, orders0_.status as status1_0_, orders0_.cid as cid1_0_ from orders orders0_ where orders0_.cid=?

结论:采用立即检索

第三种测试方式:<set name="orders"  fetch="select" lazy=”extra”>

Customers c=(Customers) session.get(Customers.class, 2);

       System.out.println(c.getEmail());

       System.out.println(c.getOrders().size());

运行结果:Hibernate: select customers0_.id as id0_0_, customers0_.realName as realName0_0_, customers0_.pass as pass0_0_, customers0_.sex as sex0_0_, customers0_.petName as petName0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_ from Customers customers0_ where customers0_.id=?

null

Hibernate: select count(id) from orders where cid =?

1

结论:采用延迟加载

总结:听从lazy属性的

 

三.Fech=”subselect”;

 

第一种测试方式:<set name="orders"  fetch="subselect" lazy=”true”>

 

 

Customers c=(Customers) session.get(Customers.class, 2);

       System.out.println(c.getEmail());

       System.out.println(c.getOrders().size());

       Set<Orders> orders=c.getOrders();

for(Orders o:orders){

           System.out.println(o.getNumber());

       }

       session.close();

    }

          

运行结果:Hibernate: select customers0_.id as id0_0_, customers0_.realName as realName0_0_, customers0_.pass as pass0_0_, customers0_.sex as sex0_0_, customers0_.petName as petName0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_ from Customers customers0_ where customers0_.id=?

null

Hibernate: select orders0_.cid as cid0_1_, orders0_.id as id1_, orders0_.id as id1_0_, orders0_.number as number1_0_, orders0_.address as address1_0_, orders0_.phone as phone1_0_, orders0_.odate as odate1_0_, orders0_.sum as sum1_0_, orders0_.status as status1_0_, orders0_.cid as cid1_0_ from orders orders0_ where orders0_.cid=?

1

2

结论:采用延迟加载;

第二种测试方式:<set name="orders"  fetch="subselect" lazy=”false”>

 

 

Customers c=(Customers) session.get(Customers.class, 2);

       System.out.println(c.getEmail());

       System.out.println(c.getOrders().size());

       Set<Orders> orders=c.getOrders();

for(Orders o:orders){

           System.out.println(o.getNumber());

       }

       session.close();

    }

          

运行结果:Hibernate: select customers0_.id as id0_0_, customers0_.realName as realName0_0_, customers0_.pass as pass0_0_, customers0_.sex as sex0_0_, customers0_.petName as petName0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_ from Customers customers0_ where customers0_.id=?

Hibernate: select orders0_.cid as cid0_1_, orders0_.id as id1_, orders0_.id as id1_0_, orders0_.number as number1_0_, orders0_.address as address1_0_, orders0_.phone as phone1_0_, orders0_.odate as odate1_0_, orders0_.sum as sum1_0_, orders0_.status as status1_0_, orders0_.cid as cid1_0_ from orders orders0_ where orders0_.cid=?

null

1

2

结论:采用立即检索

 

第三种测试方式:<set name="orders"  fetch="subselect" lazy=”extra”>

 

 

Customers c=(Customers) session.get(Customers.class, 2);

       System.out.println(c.getEmail());

       System.out.println(c.getOrders().size());

       Set<Orders> orders=c.getOrders();

for(Orders o:orders){

           System.out.println(o.getNumber());

       }

       session.close();

    }

          

运行结果:Hibernate: select customers0_.id as id0_0_, customers0_.realName as realName0_0_, customers0_.pass as pass0_0_, customers0_.sex as sex0_0_, customers0_.petName as petName0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_ from Customers customers0_ where customers0_.id=?

null

Hibernate: select count(id) from orders where cid =?

1

Hibernate: select orders0_.cid as cid0_1_, orders0_.id as id1_, orders0_.id as id1_0_, orders0_.number as number1_0_, orders0_.address as address1_0_, orders0_.phone as phone1_0_, orders0_.odate as odate1_0_, orders0_.sum as sum1_0_, orders0_.status as status1_0_, orders0_.cid as cid1_0_ from orders orders0_ where orders0_.cid=?

2

 

结论:采用延迟检索

 

总结; Lazy属性决定检索策略

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值