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属性决定检索策略