`
awaitdeng
  • 浏览: 217092 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

hibernate 连接查询

阅读更多
三、连接查询

HQL和QBC支持的各种连接类型

在程序中指定的链接查询类型
HQL语法
QBC语法
使用范围

内连接
inner join 或者 join
Criteria.createAlias()
适用于有关联的持久化类,并且在映射文件中对这种关联关系作了映射。

迫切内连接
inner join fetch 或者 join fetch
不支持

隐式内连接
   不支持

左外连接
left outer join 或者 left join
不支持

迫切左外连接
left outer join fetch 或者 left join fetch
FetchMode.EAGER

右外连接
right outer join 或者 right join
不支持

交叉连接
ClassA,ClassB
不支持
适用于不存在关联关系的持久化类

 
1、默认情况下关联级别的运行时检索策略

       采用配置文件中设置的检索策略,但有一个例外,那就是HQL会忽略映射文件设置的迫切左外连接策略,改用立即检索。

 
2、迫切左外连接

       显式指定对象的关联关系为迫切左外连接检索策略,可以覆盖映射文件中指定的检索策略。

例HQL

"from Customer c left join fetch c.orders o where c.name like 't%'"
+" o.name like 't%'"

例QBC

    List reslut=session.createCriteria(Customer.class)    .setFetchMode("orders",FetchMode.EAGER)    .add(Expression.like("name","t",MatchMode.START))
    .list();

 
       当使用迫切左外连接检索策略时,查询结果中可能会包含重复元素,可以通过一个HashSet来过滤重复元素:List result=….list();  HashSet set=new HashSet(result);

       Hibernate允许在一条查询语句中迫切左外连接多个多对一或一对一关联的类。

     List reslut=session.createCriteria(A.class)     .setFetchMode("this.b",FetchMode.EAGER)     .setFetchMode("this.c",FetchMode.EAGER)     .add(Expression.isNotNull("this.b"))     .add(Expression.isNotNull("this.c"))
     .list();

 
       当存在传递关联时,可以通过HQL来同时迫切左外连接关联类和依赖关联类,但QBC无法表达这种形式的迫切左外连接。

 
3、左外连接

       使用左外连接查询时,将根据映射文件的配置来决定关联的检索策略。

 
4、内连接

       QBC也支持内连接查询

     List reslut=session.createCriteria(Customer.class)     .add(Expression.like("name","t",MatchMode.SRART))     .createCriteria("orders")     .add(Expression.like("orderNumber","t",MatchMode.SRART))
     .list();

       默认情况下,QBC只检索出Customer对象,以上代码等同于以下HQL查询语句:

"select c from Customer c join  c.orders o where c.name like 't%'"
              + " and o.orderNumber like 't%'";

 
       createAlias()方法为关联属性(集合)赋予别名。如果希望QBC返回的集合也包含成对的Customer和Order对象,可以调用returnMaps()方法:

     List reslut=session.createCriteria(Customer.class)     .createAlias("orders","o")     .add(Expression.like("this.name","t",MatchMode.SRART))     .add(Expression.like("o.orderNumber","t",MatchMode.SRART))     .returnMaps()
     .list();

 
       采用内连接查询时,HQL与QBC有不同的默认行为,前者检索成对的对象,后者仅检索出要检索的单个对象(不包含关联的对象)。

 
5、迫切内连接

       显式指定对象的关联关系为迫切内连接检索策略,可以覆盖映射文件中指定的检索策略。

 
6、隐式内连接

一对一

"from Cunstomer c where c.homeAddress.provice like '%hai%'"

      List reslut=session.createCriteria(Customer.class)     .add(Expression.like("homeAddress.provice","t",MatchMode.SRART))
     .list();

 
多对一

"from Order o where o.customer.name like '%hai%'"

QBC 不支持隐式内连接,下边是不正确的,:

     List reslut=session.createCriteria(Order.class)     .add(Expression.like("customer.name","t",MatchMode.SRART))
     .list();

对于QBC,必须显式指定内连接查询:

     List reslut=session.createCriteria(Order.class)     .createAlias("customer","c")     .add(Expression.like("c.name","t",MatchMode.SRART))
     .list();

 
一对多或多对多

       隐式内连接不适用。

 
7、右外连接

 
8、使用SQL风格的交叉连接和隐式内连接

       HQL支持SQL风格的交叉连接查询。如: from Customer c, Order o

 
       在SQL语言中,显式内连接查询的语句使用inner join关键字,并且用on字句设定连接条件,形式为:

"select * from CUSTOMER c inner join ORDER o on c.ID=o.CUSTOMER_ID"

       隐式内连接查询语句不包含关键字阿,并且用where字句设定连接条件:

"select * from CUSTOMER c ,ORDER o where c.ID=o.CUSTOMER_ID"

 
9、关联级别运行是的检索策略

(1)没有显式指定,使用配置文件的,但有一个例外,那就是HQL会忽略映射文件设置的迫切左外连接策略,改用立即检索。

(2)如果显式指定,就会覆盖映射文件配置的检索策略。在HQL查询语句中显式指定检索策略包括以下内容。

l         left join fetch

l         inner join fetch

QBC通过FetchMode类来显式指定检索策略,有以下3个静态实例。

l         FetchMode.DEFAULT:默认,采用配置;

l         FetchMode.EAGER:覆盖,指定迫切左外连接检索策略;

l         FetchMode.LAZY:覆盖映射配置文件的检索策略,在程序中指定延迟检索策略。

待续!
分享到:
评论
1 楼 FireZHFox 2013-06-20  

相关推荐

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

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

    hibernate分页查询 数据库连接

    本篇将深入探讨Hibernate中的分页查询功能以及它如何处理数据库连接,帮助你更有效地管理大数据量的查询操作。 首先,我们来看一下什么是分页查询。在Web应用中,当用户需要浏览大量数据时,一次性加载所有数据不仅...

    hibernate 连接池配置详解

    以下是使用C3P0配置Hibernate连接池的方法: 1. **添加依赖**:确保项目中有C3P0相关的JAR包,例如`c3p0-0.8.4.5.jar`。 2. **配置连接池参数**: - 在`hibernate.cfg.xml`文件中设置以下属性来配置C3P0连接池: ...

    Hibernate连接SQLite配置说明和方言代码

    Hibernate连接SQLite配置步骤: 1、添加SQLite库: 1.1、将两个jar包:com.zy.hibernate.dialect.SQLiteDialect.jar、sqlite-jdbc-3.7.2.jar拷贝到“\WEB-INF\lib”文件夹下; 2、配置hibernate: 2.1、将...

    java hibernate连接池源码

    配置Hibernate连接池通常涉及到以下几个步骤: 1. **选择连接池**:首先,你需要决定使用哪个连接池实现。比如,如果你选择C3P0,你需要添加对应的依赖到项目中。 2. **配置Hibernate**:在Hibernate的配置文件...

    hibernate连接池.doc

    在Java的持久化框架Hibernate中,连接池是一个关键组件,用于优化数据库的连接管理,减少创建和关闭数据库连接的开销。文档中的标题和描述提到了Hibernate对第三方连接池的支持,特别是C3P0、Proxool和DBCP。下面...

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

    Hibernate 支持多种方式来实现多表连接查询,包括 HQL(Hibernate Query Language)和 Criteria 查询。本项目主要关注 Criteria API 的使用,这是一种基于 Java 对象的查询方式,更加灵活且易于理解和维护。 **...

    hibernate连接金仓数据库所需jar包集合lib.7z

    在使用Hibernate连接金仓数据库时,需要特定的驱动和其他相关jar包来支持这种连接。下面我们将详细介绍这些jar包的作用以及如何配置它们。 首先,"hibernate连接金仓数据库所需jar包集合lib.7z"这个压缩包中包含了...

    hibernate连接Access应用项目例子

    在本项目中,“hibernate连接Access应用项目例子”展示了如何使用Hibernate ORM框架与Microsoft Access数据库进行集成,实现数据的增、删、改、查(CRUD)操作。Hibernate是Java开发中的一个流行ORM(对象关系映射)...

    Hibernate连接数据库的注册的项目

    首先,Hibernate连接数据库的核心在于`hibernate.cfg.xml`配置文件。这个文件包含了数据库连接的所有必要信息,如数据库URL、用户名、密码、驱动类等。例如: ```xml <hibernate-configuration> ...

    hibernate连接池

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

    hibernate的查询方式介绍和hibernate的批处理和连接池配置hibernate

    ### Hibernate 查询方式与批处理及连接池配置详解 #### 一、Hibernate 查询方式介绍 Hibernate 是一款优秀的 ORM(对象关系映射)框架,它能够极大地简化数据库操作,并提供多种查询方式来满足不同的业务需求。 #...

    hibernate 连接sqlserver2000

    当使用Hibernate连接SQL Server 2000时,我们需要考虑以下几个关键点: 1. **驱动兼容性**:SQL Server 2000使用的是JDBC 3.0驱动,因此需要确保选用的Hibernate版本和JDBC驱动兼容此版本。通常,较早的Hibernate...

    hibernate连接池驱动

    总的来说,理解并正确配置Hibernate连接池驱动对于提升应用的性能和可扩展性至关重要。无论是c3p0还是Proxool,它们都是为了优化数据库连接的生命周期管理,减少数据库连接创建和释放带来的开销,从而提高系统整体的...

    使用Hibernate连接MySql的入门小程序

    **使用Hibernate连接MySQL的入门小程序** 在Java编程领域,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,将复杂的SQL查询转换为简单的Java对象操作。本入门程序将带你了解如何使用Hibernate...

    Hibernate连接Access

    标题“Hibernate连接Access”指的是在Java编程环境中使用Hibernate框架与Microsoft Access数据库进行交互的技术。Hibernate是一个流行的开源对象关系映射(ORM)工具,它允许开发者使用面向对象的编程方式来操作...

    用hibernate连接mycat的例子

    本示例"用hibernate连接mycat",旨在展示如何在Java项目中结合这两个技术,利用Hibernate的ORM能力处理Mycat分片后的数据。以下将详细介绍这个过程,以及相关的配置和注意事项。 首先,我们需要在项目中集成Mycat。...

    hibernate连接数据[Mysql]的代码实例

    **hibernate连接数据[Mysql]的代码实例** 在Java应用程序中,Hibernate是一个非常流行的ORM(Object-Relational Mapping)框架,它提供了强大的数据库操作能力,简化了Java与关系型数据库如MySQL之间的交互。本实例将...

    java利用hibernate连接数据库

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

    hibernate 自连接 emp例子

    在这个特定的例子中,我们关注的是如何在Hibernate中实现自连接查询,以处理Oracle数据库中EMP表的树状结构问题。 首先,自连接查询是指一个表与自身进行连接的操作,常用于处理具有层级关系的数据,例如员工的上...

Global site tag (gtag.js) - Google Analytics