`

hibernate连接查询总结

 
阅读更多

假使现在有两张关联表,customer和order,一般情况下是一个customer可以对应多个order,而一个order只能对应一个 customer;那么order中会有个customer对象作为属性,hbm中会有个many-to-one;而customer中,会有一个 set<Order>,hbm中会有一个one-to-may.

 

下面我们研究下在各种连接方式下的查询的策略及结果,并对其归纳总结,

 

第一,无连接

hql:from Customer cwhere c.name like “T%”

说明:以上语句未显示指定其关联的order、

执行的sql:select * from customer  wherename like “T%”

查询结果为:

Id

Name

Age

1

Tom

21

5

Tom

25

结果:结果中包含两个customer的对象元素,他们分别对应id是1和5的两条数据,他们的order集合属性均未被初始化。

第二,迫切左外连接

hql:from Customer c leftjoin fetch c.order where c.name like “T%”

说明:显示指定查询某人对应的order属性

执行的sql:select c.C_ID, c.NAME , o.ID , o.ORDER_NUMBER, o.CUSTOMER_ID

From CUSTOMER c left out join ORDER o onc.ID=o.CUSTOMER_ID  where (c.NAME like “T%”)

查询结果为:

C_ID

NAME

AGE

O_ID

O_NUMBER

CUSToMER_ID

1

tom

21

1

Tom_order001

1

1

tom

21

2

Tom_order002

1

1

tom

21

3

Tom_order003

1

5

tom

25

null

null

null

结果:以左表为基础,查询所有T开头的用户的对应的order。当用户无订单时,其order属性用null填充。

(注:hibernate允许一条查询迫切左外连接到多个,多对一或者一对一的关联表;比如A表中有一个字段bId,一个字段cId;而分别存在一 个B表和C表,两者的id分别是A的属性。那么他们在进行迫切左外连接时,语句为:from A a left join fetch a.b b left join fetch a.c c where b is notnull and c is not null。或者第二种情况为A中有bId,B中有cId,C表不与其他表关联,那么他们的语句为:from A a left join fetch a.b b left join fetch b.c where b is notnull and c is not null)

 

第三,左外连接

hql: from Customer c left join c.orderwhere c.name like “T%”

说明:显示指定查询某人对应的order属性

执行的sql:select c.ID C_ID, c.NAME , c.AGE, o.ID O_ID , o.ORDER_NUMBER,o.CUSTOMER_ID  from CUSTOMER c left outer join ORDERS  o on c.ID=o.CUSTOMER_ID where (c.NAME like ‘T%’)

查询结果为:

C_ID

NAME

AGE

O_ID

ORDER_NUMER

CUSTOMER_ID

1

Tom

21

1

Tom_order001

1

1

Tom

21

2

Tom_order002

1

1

Tom

21

3

Tom_order003

1

5

Tom

25

null

null

null

 

 

第四,内连接

hql: from Customer c inner join c.orders owhere c.name like”T%”

执行的sql语句:select c.ID C_ID ,c.NAME,c.AGE , o.ID O_ID , o.ORDER_NUMBER,o.CUSTOMER_IDfrom CUSTOMER c inner join ORDERS o on c.ID=o.CUSTOMER_ID   where (c.NAME like ‘T%’)

查询结果为:

C_ID

NAME

AGE

O_ID

ORDER_NUMBER

CUSTOMER_ID

1

Tom

21

1

Tom_order001

1

1

Tom

21

2

Tom_order002

1

1

Tom

21

3

Tom_order003

1

 

 

第五,迫切内链接

hql:from Customer cinner join fetch c.orders o where c.name like ‘T%’

执行的sql:select c.ID C_ID ,c.NAME,c.AGE , o.ID O_ID , o.ORDER_NUMBER,o.CUSTOMER_IDfrom CUSTOMER c inner join ORDERS o on c.ID=o.CUSTOMER_ID   where (c.NAME like ‘T%’)

查询结果为:

C_ID

NAME

AGE

O_ID

ORDER_NUMBER

CUSTOMER_ID

1

Tom

21

1

Tom_order001

1

1

Tom

21

2

Tom_order002

1

1

Tom

21

3

Tom_order003

1

 

 

第六,右外链接

 

Hql:from Customer c rightjoin fetch c.orders o where c.name like ‘T%’

执行的sql:select c.ID C_ID ,c.NAME,c.AGE , o.ID O_ID , o.ORDER_NUMBER,o.CUSTOMER_IDfrom CUSTOMER c right outer join ORDERS o on c.ID=o.CUSTOMER_ID   where (c.NAME like ‘T%’)

查询结果为:

C_ID

NAME

AGE

O_ID

ORDER_NUMBER

CUSTOMER_ID

1

Tom

21

1

Tom_order001

1

1

Tom

21

2

Tom_order002

1

1

Tom

21

3

Tom_order003

1

 

 

 

 总结则为下表所示:

连接方式

对应的sql查询

Orders集合的检索策略

查询结果的内容

无连接

查询单个customer表

延迟检索策略

集合包含customer的元素;集合中无重复元素;customer对应的order对象没有被初始化

迫切左外连接

左外连接查询customer和order

迫切左外连接检索策略

集合中包含customer的元素;集合中可能有重读元素;customer对象的order集合属性被初始化

左外连接

左外连接查询customer和order

延迟检索策略

集合中包含对象数据类型的元素,每个对象数组包含一对customer对象和order对象,不同的对象数组可能重复引用同一个customer对象了;customer对象的order集合属性未被初始化。

内连接

内连接查询customer表和order表

延迟检索策略

集合中包含对象数据类型的元素,每个对象数组包含一对customer对象和order对象,不同的对象数组可能重复引用同一个customer对象了;customer对象的order集合属性未被初始化。

迫切内连接

内连接查询customer和order

迫切内链接检索策略

集合中包含customer类型的元素;集合中可能有重复元素,customer对象的order集合属性被初始化。

右外链接

右外链接查询customer表和order

延迟检索策略

集合中包含对象数组类型的元素,每个对象包含一对customer和order,不同的对象数组可能引用同一个customer对象,customer对象的order集合属性未被初始化。

 

0
3
分享到:
评论
1 楼 jacking124 2013-06-09  
希望你可以对懒加载这部分的内容,好好讲述一下的,目前我自己测试了,但是没有发现异同!

相关推荐

    Hibernate知识点总结

    ### Hibernate知识点总结 #### 一、Hibernate概述 Hibernate是一个开源的ORM(Object Relational Mapping,对象关系映射)框架,用于Java应用与关系型数据库之间的交互。它通过使用描述对象和数据库之间映射的元...

    hibernate分页查询 数据库连接

    总结起来,Hibernate的分页查询和数据库连接管理是其强大功能的重要组成部分。正确理解和使用这些特性,能够帮助开发者构建出高性能、可扩展的Java应用。在实际项目中,根据具体需求和场景选择合适的策略,结合最佳...

    Hibernate hql查询语法总结

    本文将对Hibernate HQL查询语法进行总结,涵盖基础查询、属性查询、实例化查询以及查询链接等多个方面。 1. 基础查询: 基础查询是最简单的HQL语句,用于获取所有`Student`对象。例如: ```java from Student ``` ...

    Hibernate 多表连接分页查询示范项目

    总结,"Hibernate 多表连接分页查询示范项目"是一个实用的示例,它展示了如何在实际应用中利用 Hibernate Criteria API 实现复杂查询和分页,对于学习和掌握 Hibernate 的高级特性和数据库操作技巧非常有帮助。...

    Hibernate 简单 PPT 总结

    【Hibernate 简单 PPT 总结】 Hibernate 是一个流行的开源对象关系映射(ORM)框架,它简化了Java应用程序对数据库的操作。通过提供一套API和元数据,Hibernate允许开发者将业务对象直接映射到数据库表,从而避免了...

    hibernate连接池

    总结来说,Hibernate连接池是提升数据库访问效率的关键,它提供了多种连接池的集成,包括C3P0、DBCP、HikariCP和Druid。开发者可以根据项目需求和性能指标,选择合适的连接池并进行精细配置,以优化数据库操作,提高...

    hibernate 自连接 emp例子

    总结来说,Hibernate的自连接查询是一种高效处理表内层级关系的方法,尤其对于像员工管理这样的场景,能够简化代码并提供更直观的数据操作方式。通过正确配置实体类和映射文件,以及恰当的HQL查询,我们可以方便地...

    java利用hibernate连接数据库

    Java通过Hibernate连接数据库是Java开发中的常见操作,Hibernate作为一个强大的对象关系映射(ORM)框架,极大地简化了数据库操作。本篇文章将详细讲解如何利用Hibernate在Java项目中建立数据库连接,以及提供一个...

    Hibernate中连接MySql所需的jar包

    总结起来,为了使用Hibernate连接MySQL数据库,你需要`hibernate3.6.7.jar`来实现ORM功能,以及`mysqljdbc.jar`作为数据库连接驱动。这两个jar包是实现Java应用与MySQL数据库通信的基础,确保了数据操作的顺利进行。...

    hibernate多表联合查询

    使用HQL进行多表联合查询是非常直观的,我们可以直接使用`FROM`子句来指定要查询的表,然后使用`JOIN`子句来连接不同的表。示例如下: ```java // 假设Customer和Charge实体类已定义好 Session session = ...

    hibernate配置连接池大全

    总结,Hibernate连接池的配置是优化数据库操作性能的关键步骤。正确选择和配置连接池,可以大大提高系统的响应速度和稳定性。本文以Proxool为例,介绍了配置过程,并简要提及了其他常见的连接池,希望能为你的项目...

    HIbernate连接池配置总结基于第三方c3p0和proxool

    Hibernate连接池是一种管理数据库连接的机制,它允许应用程序重用已打开的数据库连接,避免频繁地创建和关闭连接,从而提高数据库操作的性能和效率。连接池在初始化时会创建一定数量的连接,当应用程序需要数据库...

    Hibernate Proxool连接池配置总结及常遇问题

    **Hibernate Proxool连接池配置详解** 在Java应用程序中,数据库连接池是管理数据库连接的一种高效方式,它可以显著提升系统性能,减少数据库资源的浪费。本文将深入探讨Hibernate与Proxool连接池的配置,以及在...

    hibernate 配置连接池的三种方法

    总结起来,选择哪种连接池取决于项目需求和兼容性。C3P0提供了一种简单易用的配置方式,而Tomcat JDBC连接池因其高效和稳定性受到广泛青睐。在配置时,要确保所有必要的属性都已经设置,并根据应用的实际情况调整...

    hibernate学习总结文档

    - **HQL(Hibernate Query Language)**:类似于 SQL,但面向对象,支持更高级的查询功能,如连接、子查询和聚合函数。 - **Criteria API**:提供动态构建查询的接口,适用于不熟悉 HQL 或 SQL 的开发者。 - **Query...

    通用的hibernate查询

    除了基础的查询,Hibernate还支持连接查询、子查询、聚合函数等高级功能。例如,如果你需要根据用户的年龄进行分组并计算每个年龄段的用户数量,可以这样写: ```java String hql = "select age, count(*) from ...

    Hibernate课程的总结

    **标题:“Hibernate课程的总结”** 在学习Hibernate框架的过程中,我们深入探讨了它在Java企业级应用中的核心地位。Hibernate作为一个强大的对象关系映射(ORM)工具,它简化了数据库与Java对象之间的交互,消除了...

    hibernate连接各种数据库的配置

    ### Hibernate连接各种数据库的配置详解 #### 一、概述 在软件开发中,数据库操作是一项基本且重要的功能。Hibernate作为一种流行的Java持久层框架,能够帮助开发者简化与数据库交互的过程。本文将详细介绍如何...

    Hibernate_query查询数据表中的一个字段.

    在使用Hibernate进行查询前,首先需要进行基本的配置,包括创建hibernate.cfg.xml配置文件,设置数据库连接信息,以及实体类和表的映射文件(.hbm.xml)。 三、Entity类与表的映射 在Hibernate中,每一个数据库表都...

    hibernate文档总结,技术汇总,PDF版的,hibernate简明参考文档

    总结来说,Hibernate是一个强大的ORM框架,它极大地简化了Java应用的数据库操作,提高了开发效率,并提供了高级特性如缓存、事务管理等。通过深入理解和熟练使用Hibernate,开发者可以构建更高效、更易于维护的...

Global site tag (gtag.js) - Google Analytics