`

Hibernate的对象检索策略 (一) SQL左外连接检索策略

阅读更多
首先是测试表的结构:



先通过hibernate将数据放入数据库,如下:
		Session session = HibernateUtil.openSession();
		
		Transaction tx=session.beginTransaction();
		
		User u1=new User(1,"Tom",19);
		User u2=new User(2,"Mike",19);
		User u3=new User(3,"Jack",19);
		User u4=new User(4,"Linda",19);
		
		Order o1=new Order(1,"Tom_Order001",u1);
		Order o2=new Order(2,"Tom_Order002",u1);
		Order o3=new Order(3,"Mike_Order001",u2);
		Order o4=new Order(4,"Jack_Order001",u3);
		Order o5=new Order(5,"Linda_Order001",u4);
		
		u1.setOrders(ArraysHelper.asSet(o1,o2));
		u2.setOrders(ArraysHelper.asSet(o3));
		u3.setOrders(ArraysHelper.asSet(o4));
		u4.setOrders(ArraysHelper.asSet(o5));
		
		session.save(u1);
 		session.save(u2);
 		session.save(u3);
 		session.save(u4);
		
		
		tx.commit();


====================================================
数据加入之后, 看一下检索的方法。

第一种是:
List userList=session.createQuery("from User as u").list();
for(User u:userList){
			System.out.println(u.getOrders().iterator().next().getName());
		}


-运行以上方法时,Hibernate将先查询User表中的所有记录,然后根据每条记录的ID,到Order表中查询有关的记录,Hibernate将以此执行以下select语句:

select * from User;
select * from Order where customer_id=1;
select * from Order where customer_id=2;
select * from Order where customer_id=3;
select * from Order where customer_id=4;

上述方法的缺点:
-select语句的数目太多,需要频繁的访问数据库,会影响检索性能。如果需要查询n个User对象,那么必须执行n+1次select查询语句。这种检索策略没有利用SQL的链接查询功能。

SQL左外连接检索策略
一.通过配置文件指定自动左外连接检索

例如以上5条select语句完全可以通过以下1挑select语句来完成:
select * from User left outer join Order on User.id = Order.Customer_id



-以上select语句使用了SQL的左外连接查询功能,能够在一条select语句中查询出User表的所有记录,以及匹配的Order表的记录。

在Hibernate中, 多对一的关联配置文件中可以配置使用左外连接检索策略。
把Order.hbm.xml文件的<many-to-one>元素的outer-join属性设置为true,程序执行时就会自动使用左外连接检索策略。
运行结果如下:



通过此方法, 当运行下面的代码时:
Order order=(Order) session.get(Order.class, 1);
		
		System.out.println(order.getName());
		
		System.out.println(order.getUser().getName());


就只会像数据库发送一条左外连接的select语句,大大降低了数据库开销。
输出结果:
Hibernate: select order0_.id as id1_1_1_, order0_.test_name as test2_1_1_, order0_.customer_id as customer3_1_1_, user1_.id as id1_3_0_, user1_.test_name as test2_3_0_, user1_.test_age as test3_3_0_ from test_order order0_ left outer join test_user user1_ on order0_.customer_id=user1_.id where order0_.id=?
Tom_Order001
Tom




二. 在程序中显式指定左外连接策略检索
- 以下Session的方法都用于检索OID为1的User对象。
session.createQuery("from User as u where u.id=1");
session.createQuery("from User as u left join fetch u.orders where u.id=1");

在执行第一个方法时,Hibernate会使用映射文件配置的检索策略。
在执行第二个方法时,在HQL语句中显式指定左外连接检索关联的Order对象,因此会覆盖映射文件配置的检索策略。不管在User.hbm.xml文件中<set>元素的lazy属性是true还是false,Hibernate都会执行以下select语句:

select * from User left outer join Order on User.id = Order.customer_id where User.id=1;


  • 大小: 88.8 KB
  • 大小: 30.8 KB
  • 大小: 42.9 KB
分享到:
评论

相关推荐

    Hibernate的检索策略

    在Java持久化框架Hibernate中,检索策略是一种重要的机制,它主要用于控制对象何时以及如何加载到应用程序内存中。合理的检索策略不仅可以提高应用性能,还能简化代码逻辑,使得开发过程更加高效。Hibernate支持两种...

    hibernate5--4.检索方式及策略

    一、Hibernate检索方式 1. **HQL(Hibernate Query Language)**: HQL是Hibernate提供的面向对象的查询语言,类似于SQL,但它是基于类和对象的。你可以通过HQL来查询、更新和删除对象,而无需关心底层的SQL语法。...

    Hibernate 对象的状态检索

    本人在厦门邦初培训时候 使用的快速入门精简文档 Session缓存的作用 Session清理缓存的时间点 对象的临时状态、持久状态和游离状态 用session的update()方法使游离对象转变为持久化对象。...本地SQL检索方式

    day36 04-Hibernate检索方式:多表连接查询

    标题中的“day36 04-Hibernate检索方式:多表连接查询”表明这是一个关于Hibernate框架的教程,重点讲解如何在Hibernate中进行多表连接查询。在这个主题中,我们将深入探讨Hibernate的ORM(对象关系映射)机制以及...

    hibernate的检索

    【Hibernate检索策略】 Hibernate提供三种主要的检索策略:立即检索、延迟检索和迫切左外连接检索。 1. **立即检索**:这种策略将立即加载关联的对象,无论对象是持久化状态还是游离状态。优点是应用程序可以方便...

    Hibernate的检索方式

    以上介绍了Hibernate的五种检索方式:导航对象图检索、OID检索、HQL检索、QBC检索以及本地SQL检索。每种检索方式都有其独特的应用场景和特点。在实际开发过程中,根据项目的需求和技术背景选择合适的检索方式,可以...

    J2EE Hibernate-6.ppt

    《J2EE Hibernate-6.ppt》探讨了Hibernate在J2EE环境中的检索策略,主要涉及立即检索策略、延迟检索策略以及迫切左外连接检索策略。 1. **立即检索策略**: 立即检索策略是Hibernate默认的检索方式。在处理一对多...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     16.6 在应用程序中显式指定迫切左外连接检索策略  16.7 属性级别的检索策略  16.8 小结  16.9 思考题 第17章 Hibernate的检索方式(上)  17.1 Hibernate的检索方式简介  17.1.1 HQL检索方式  17.1.2 QBC...

    java-Hibernate 检索

    Hibernate 是一个流行的 Java 持久层框架,它提供了多种检索数据的方式,包括导航对象图检索、OID 检索、HQL 检索、QBC 检索和本地 SQL 检索等。下面将详细介绍每种检索方式。 一、导航对象图检索 导航对象图检索...

    基于Spring的Hibernate Search全文检索功能示例

    2. **Hibernate ORM**:Hibernate是一个对象关系映射框架,它允许开发者使用Java对象来操作数据库,消除了Java代码和SQL之间的直接耦合。 3. **Hibernate Search**:作为Hibernate的一个扩展,Hibernate Search提供...

    Hibernate实战笔记

    - **Hibernate中的n+1查询问题**:当使用默认的立即检索策略时,Hibernate会在检索一个对象的同时检索其关联的所有对象。例如,在一个`Customer`与多个`Order`的关联关系中,如果数据库中有`n`个客户,则Hibernate将...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     16.6 在应用程序中显式指定迫切左外连接检索策略  16.7 属性级别的检索策略  16.8 小结  16.9 思考题 第17章 Hibernate的检索方式(上)  17.1 Hibernate的检索方式简介  17.1.1 HQL检索方式  17.1.2 QBC...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     16.6 在应用程序中显式指定迫切左外连接检索策略  16.7 属性级别的检索策略  16.8 小结  16.9 思考题 第17章 Hibernate的检索方式(上)  17.1 Hibernate的检索方式简介  17.1.1 HQL检索方式  17.1.2 QBC...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     16.6 在应用程序中显式指定迫切左外连接检索策略  16.7 属性级别的检索策略  16.8 小结  16.9 思考题 第17章 Hibernate的检索方式(上)  17.1 Hibernate的检索方式简介  17.1.1 HQL检索方式  17.1.2 QBC...

    hibernate基础 注解开发 检索

    - **HQL (Hibernate Query Language)**:一种面向对象的查询语言,类似于SQL但更加面向对象。 - **QBC (Query By Criteria)**:基于标准的API提供了一种构建查询条件的方法。 - **本地SQL**:直接执行SQL语句,适用...

    Hibernate检索方式

    ### Hibernate检索方式详解 #### 一、概述 Hibernate是一个强大的对象关系映射(ORM)框架,它可以将Java对象与数据库表进行映射,使得开发者能够更方便地进行数据的持久化操作。在Hibernate中,提供了多种检索...

    hibernate面试题大全

    在Hibernate中,针对关联对象的检索,有三种主要的检索策略:立即检索(Eager Fetching)、延迟检索(Lazy Fetching)和迫切左外连接检索(Anxious Left Join Fetching)。下面将详细探讨这三种策略的特点。 #### 1. 立即...

Global site tag (gtag.js) - Google Analytics