`

Hibernate(24): 为什么用DetachedCriteria不能表连接地取数据?

阅读更多

    HQL到DetachedCriteria的转换? 中是项目中实际问题描述, 这里用一个独立的例子来模拟项目中的问题,也基于此做debug跟踪.

     例子中有两个类: Husband和Wife,在Husband类里对Wife做了OneToOne关联. 代码和基于Annotation的映射配置如下:

@Entity
public class Husband {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Integer id;
    private String name;
   
    @OneToOne(fetch=FetchType.LAZY)  // (1)
    @JoinColumn(name="wife_id", nullable=false,unique=true)
    private Wife wife;

    

@Entity
public class Wife {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Integer id;
    private String name;
 


    更详细的类文件与基于Mysql的建表及数据见附件.

 配置好后, 做如下实验:
    1, 直接用如下HQL
        "select h.wife from Husband h where h.id = :id"
取数据, 没问题,只取出了对应Wife类的信息. Hibernate生成的SQL语句如下:
          select wife1_.id as id1_, wife1_.name as name1_ from Husband husband0_ inner join Wife wife1_ on husband0_.wife_id=wife1_.id where husband0_.id=?
     从上面生成SQL来看, Hibernate做了表连接查询,结果集中也只有Wife类信息.

    2,  用如下所示的DetachedCriteria取数据:
        DetachedCriteria.forClass(Husband.class)
            .add(Property.forName("id").eq(1))
            .setProjection(Property.forName("wife").as("wifeAlias"))
            .setFetchMode("wifeAlias", FetchMode.JOIN)  //(2)
            .setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);

        从运行结果看, 正确的Wife信息取出来了. 不过看相应的SQL,发现有此不对.
        Hibernate生成并执行的SQL如下:
            select this_.wife_id as y0_ from Husband this_ where this_.id=?
            select wife0_.id as id1_0_, wife0_.name as name1_0_ from Wife wife0_ where wife0_.id=?

        也就是说, Hibernate并没有做表连接查询,而采用的是二次查询,即从Husband表里得出相应的wife ID,再到Wife表里去取Wife信息. 这样虽说项目中的问题解决了(后来发现并没有解决,详见下一篇:Eclipse的debug欺骗了我), 但与上面红色标志的(2)处的设置不对. (2)处设置的FetchMode为JOIN,为什么不做表连接查询呢?

    3, 在上面红色标志(2)处,改为FetchMode.EAGER还是行. 还是二次查询,并没有像用HQL那样一次表连接地取出数据来.

    4, 只是作为一种可能性的试试,在上面红色标志(1)处,改为fetch=FetchType.EAGER,与实验3结果一样.


    这里把围绕这个问题的实验,记录下来,一是希望引起大家的讨论,二是作为自己的一个备忘并在此基础上做进一步研究.

0
1
分享到:
评论

相关推荐

    Hibernate 使用DetachedCriteria操作

    Hibernate 是一个开源的对象关系映射(ORM)框架,它提供了数据访问和事务处理的解决方案,通过将业务对象与数据库表之间的映射关系自动化,避免了繁琐的SQL编写和结果集的遍历。它支持JPA规范,并且拥有自己的API,...

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

    总结,Hibernate提供多种方式查询数据表中的字段,包括HQL、Criteria API和DetachedCriteria,选择合适的方法取决于具体需求。正确理解和使用Hibernate,能够大大提高Java开发中的数据库操作效率。

    Hibernate执行持久层访问步骤

    1. 插入数据:调用Session的save()或saveOrUpdate()方法,Hibernate会自动为无ID的对象生成ID,并将其保存到数据库。 2. 更新数据:使用update()或saveOrUpdate()方法更新已存在的实体状态。 3. 删除数据:调用...

    Hibernate_使用示例代码

    通过学习这个“Hibernate_使用示例代码”资源,开发者可以深入理解Hibernate的工作原理,掌握其核心概念,并能将这些知识应用于实际项目,提升开发效率和代码质量。对于初学者,这是一个很好的起点,对于有经验的...

    传智播客_hibernate

    1. **对象关系映射(ORM)**: Hibernate是ORM的一种实现,它将Java对象与数据库表进行映射,使开发者可以用面向对象的方式来操作数据库。 2. **Configuration**: Hibernate配置文件(hibernate.cfg.xml)用于设置...

    Hibernate思维导图

    **Hibernate 思维导图详解** Hibernate 是一个流行的开源对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互。...在学习过程中,使用思维导图能帮助我们更好地组织和记忆这些知识点,形成清晰的框架。

    Hibernate3中文文档

    Hibernate作为一款开源的对象关系映射(ORM)框架,极大地简化了Java应用程序对数据库的操作,使得开发者可以更加专注于业务逻辑,而非底层的数据访问细节。 在Hibernate3版本中,主要包括以下几个核心知识点: 1....

    Hibernate开发所需的jar包

    Hibernate是一款强大的Java语言下的对象关系映射(ORM)框架,它极大地简化了数据库与Java应用程序之间的交互。在Java开发中,使用Hibernate可以避免编写大量的SQL语句,而是通过面向对象的方式来操作数据库,使得...

    hibernate 3.2.2

    Hibernate 3.2.2是一款在Java开发领域广泛使用的对象关系映射(ORM)框架,它为开发者提供了强大的数据持久化功能,极大地简化了数据库操作。尽管最新版本已经更新到4.1以上,但Hibernate 3.2.2因其稳定性和兼容性,...

    hibernate in action 中文版书籍

    通过阅读《Hibernate in Action》中文版,Java开发者不仅可以掌握Hibernate的使用技巧,还能理解其设计理念,从而在实际项目中更高效、灵活地进行数据库操作,提升开发效率。无论你是初学者还是有经验的开发者,这...

    hibernate-2.0.zip

    - Hibernate:一个强大的ORM框架,通过映射Java对象到数据库表,实现了对象和关系数据之间的转换。 - Hibernate 2.0:该框架的特定版本,引入了许多新特性和改进,如查询语言HQL、级联操作等。 **内容:** 1. **...

    hibernate开发包

    - **对象关系映射 (ORM)**:ORM 是 Hibernate 的基础,它将数据库中的表映射为 Java 类,将表记录映射为 Java 对象,从而实现了数据库操作的对象化。 - **Entity(实体)**: 在 Hibernate 中,实体是数据库表的 ...

    Hibernate培训教程.doc

    【Hibernate培训教程】 Hibernate,作为一个开源的对象关系映射(ORM)框架,是Java开发者处理数据库操作的重要工具。它简化了数据库编程,使得开发者可以使用面向对象的方式来操作数据库,而无需直接编写SQL语句。...

    hibernate-distribution中文帮助手册

    Hibernate是一个流行的开源对象关系映射(ORM)工具,它允许Java开发者在数据库操作中使用面向对象的方式,极大地简化了数据库编程。 描述中的"来自:...

    hibernate3.2_src官方源码

    通过深入学习这些关键概念和组件,开发者可以更好地掌握Hibernate的工作原理,提升数据库操作的效率和灵活性,同时也能为解决实际项目中的问题提供理论基础。对于Java开发者来说,研究`hibernate3.2_src`官方源码是...

    hibernate-api

    通过提供一种对象化的数据访问方式,Hibernate使得开发者可以使用面向对象的编程模型来处理数据库操作,而无需直接编写SQL语句。 在Java应用中,Hibernate API主要包含以下几个关键模块: 1. **SessionFactory**:...

    hibernate官网jar包

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作转化为对象操作,从而简化数据库编程。在Java应用中,Hibernate 提供了一种便捷的方式,将数据库中的数据与Java对象进行绑定,避免了...

    hibernate3.3.zip

    通过以上对Hibernate 3.3核心API的深入解析,读者应该能够更好地理解和使用这个ORM框架,从而提高Java应用的数据管理效率和代码质量。在实际项目中,结合具体的业务需求,灵活运用这些API,能进一步提升开发效率和...

    《hibernate逍遥游记》附属光盘之源码

    通过分析《Hibernate逍遥游记》的源码,读者不仅可以深入理解Hibernate的工作原理,还能掌握实际项目中如何高效地应用Hibernate进行数据访问层的设计和开发。这些源码实例为学习者提供了一个实战演练的平台,有助于...

Global site tag (gtag.js) - Google Analytics