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结果一样.
这里把围绕这个问题的实验,记录下来,一是希望引起大家的讨论,二是作为自己的一个备忘并在此基础上做进一步研究.
分享到:
相关推荐
Hibernate 是一个开源的对象关系映射(ORM)框架,它提供了数据访问和事务处理的解决方案,通过将业务对象与数据库表之间的映射关系自动化,避免了繁琐的SQL编写和结果集的遍历。它支持JPA规范,并且拥有自己的API,...
总结,Hibernate提供多种方式查询数据表中的字段,包括HQL、Criteria API和DetachedCriteria,选择合适的方法取决于具体需求。正确理解和使用Hibernate,能够大大提高Java开发中的数据库操作效率。
1. 插入数据:调用Session的save()或saveOrUpdate()方法,Hibernate会自动为无ID的对象生成ID,并将其保存到数据库。 2. 更新数据:使用update()或saveOrUpdate()方法更新已存在的实体状态。 3. 删除数据:调用...
通过学习这个“Hibernate_使用示例代码”资源,开发者可以深入理解Hibernate的工作原理,掌握其核心概念,并能将这些知识应用于实际项目,提升开发效率和代码质量。对于初学者,这是一个很好的起点,对于有经验的...
1. **对象关系映射(ORM)**: Hibernate是ORM的一种实现,它将Java对象与数据库表进行映射,使开发者可以用面向对象的方式来操作数据库。 2. **Configuration**: Hibernate配置文件(hibernate.cfg.xml)用于设置...
**Hibernate 思维导图详解** Hibernate 是一个流行的开源对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互。...在学习过程中,使用思维导图能帮助我们更好地组织和记忆这些知识点,形成清晰的框架。
Hibernate作为一款开源的对象关系映射(ORM)框架,极大地简化了Java应用程序对数据库的操作,使得开发者可以更加专注于业务逻辑,而非底层的数据访问细节。 在Hibernate3版本中,主要包括以下几个核心知识点: 1....
Hibernate是一款强大的Java语言下的对象关系映射(ORM)框架,它极大地简化了数据库与Java应用程序之间的交互。在Java开发中,使用Hibernate可以避免编写大量的SQL语句,而是通过面向对象的方式来操作数据库,使得...
Hibernate 3.2.2是一款在Java开发领域广泛使用的对象关系映射(ORM)框架,它为开发者提供了强大的数据持久化功能,极大地简化了数据库操作。尽管最新版本已经更新到4.1以上,但Hibernate 3.2.2因其稳定性和兼容性,...
通过阅读《Hibernate in Action》中文版,Java开发者不仅可以掌握Hibernate的使用技巧,还能理解其设计理念,从而在实际项目中更高效、灵活地进行数据库操作,提升开发效率。无论你是初学者还是有经验的开发者,这...
- Hibernate:一个强大的ORM框架,通过映射Java对象到数据库表,实现了对象和关系数据之间的转换。 - Hibernate 2.0:该框架的特定版本,引入了许多新特性和改进,如查询语言HQL、级联操作等。 **内容:** 1. **...
- **对象关系映射 (ORM)**:ORM 是 Hibernate 的基础,它将数据库中的表映射为 Java 类,将表记录映射为 Java 对象,从而实现了数据库操作的对象化。 - **Entity(实体)**: 在 Hibernate 中,实体是数据库表的 ...
【Hibernate培训教程】 Hibernate,作为一个开源的对象关系映射(ORM)框架,是Java开发者处理数据库操作的重要工具。它简化了数据库编程,使得开发者可以使用面向对象的方式来操作数据库,而无需直接编写SQL语句。...
Hibernate是一个流行的开源对象关系映射(ORM)工具,它允许Java开发者在数据库操作中使用面向对象的方式,极大地简化了数据库编程。 描述中的"来自:...
通过深入学习这些关键概念和组件,开发者可以更好地掌握Hibernate的工作原理,提升数据库操作的效率和灵活性,同时也能为解决实际项目中的问题提供理论基础。对于Java开发者来说,研究`hibernate3.2_src`官方源码是...
通过提供一种对象化的数据访问方式,Hibernate使得开发者可以使用面向对象的编程模型来处理数据库操作,而无需直接编写SQL语句。 在Java应用中,Hibernate API主要包含以下几个关键模块: 1. **SessionFactory**:...
Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作转化为对象操作,从而简化数据库编程。在Java应用中,Hibernate 提供了一种便捷的方式,将数据库中的数据与Java对象进行绑定,避免了...
通过以上对Hibernate 3.3核心API的深入解析,读者应该能够更好地理解和使用这个ORM框架,从而提高Java应用的数据管理效率和代码质量。在实际项目中,结合具体的业务需求,灵活运用这些API,能进一步提升开发效率和...
通过分析《Hibernate逍遥游记》的源码,读者不仅可以深入理解Hibernate的工作原理,还能掌握实际项目中如何高效地应用Hibernate进行数据访问层的设计和开发。这些源码实例为学习者提供了一个实战演练的平台,有助于...