`

[转]Hibernate中的outer-join(二):fetch

阅读更多
    这篇文章挺好的.


Hibernate中的outer-join(二):fetch

 

<link media="all" href="/tf-resource/css/outputText/tf-outputText.css" type="text/css" rel="stylesheet">在hibernate3里,提供了一个新的属性:fetch。可以用fetch来代替outer-join。

 
Hibernate3的one-to-one/many-to-one属性里增加了一个fetch属性。

fetch属性可以为:select或者join。
当设置为join的时候,采用外联结方式查询,具体参考 上篇文章。


另外hibernate3里可以在HQL里明确指定fetch:
"From Student as s JOIN FETCH s.classz"
表示查询Student的时候,采用外联结方式查询classz表。

在这里补充说明一下,为什么有时需要外联结查询。
举例说明:
有2个表User 和 Contact两个对象分别对应数据库中 用户 和 联系地址 两张表。User 和 Contact是一对一关联。如果不采用外联结查询的话,问题就出现了,如果
   1. From User where rownum < 100,
这时就会:
先执行:
   select * from user

然后针对每个user执行
   select * from contact where user_id=?

也就是说,用一条SQL语句就能查询出来的功能,采用hibernate HQL查询,却需要请求数据库 1+n 次(这个例子执行了101次数据库查询)。

为什么会出现这种情况呢?
这是由于one-to-one的固定机制造成的。如果不采用外联结查询方式,查询出User数据的时候,这时并不能从User数据知道Contact数据存不存在,必须进行数据库查询。

为了减少这种不必要的数据库查询,可以设置查询时采用外联结方式。
但要注意一点的是,采用外联结方式虽然可以减少数据库查询次数,但如果采用cache或者二级cache,因为外联结的查询条件的不确定性,会大大降低缓存/二级缓存的效果。

所以具体怎么定,还要根据业务来定。
分享到:
评论
1 楼 sunjun 2009-02-18  
引用
hibernate3里,提供了一个新的属性:fetch。可以用fetch来代替outer-join。

请问一下,你这里的意思是不是说Hibernate3里面现在是用fetch来设置外联结方式查询,而不是使用以前的outer-join,我碰到一个问题http://www.iteye.com/problems/11520,能不能帮忙解决一下,谢谢!!!

相关推荐

    Hibernate Fetch 的作用

    例如,在上面的代码片段中,通过`left outer join fetch parent.childs`语句,我们告诉Hibernate在加载`Parent`实体时,也一并加载所有相关的`Child`实体。这样,即使`Parent`实体的`childs`属性被标记为`lazy="true...

    HQL连接查询和注解使用总结

    - 示例:`FROM Employee e LEFT OUTER JOIN FETCH e.department` - 注意:如果右侧可能为`NULL`,则不能使用`fetch`关键字进行集合填充。 - **右外连接(Right Outer Join)** - 语法:`right[outer]join` - ...

    Hibernate关联关系hbm.xml中的相关属性

    5. `outer-join`: 控制是否使用外连接进行查询,可能的值有`auto`, `true`, `false`。 6. `update`, `insert`: 分别决定关联字段是否在UPDATE和INSERT语句中包含。设为`false`表示关联值由其他方式提供。 7. `...

    Hibernate使用技巧汇总

    - `outer-join`: 是否使用外联接。 - **双向管理**: - 需要在两边都设置`inverse`和`lazy`。 - `cascade`只能设置为`insert-update`。 - **示例**: - `group1.getRoles().add(role1);` - `role1.getGroups()....

    Hibernate配置文件

    - `hibernate.use_outer_join`: 是否启用外连接加载,提高查询效率。 - `hibernate.connection.release_mode`: 控制何时释放数据库连接,比如`after_transaction`在事务结束时释放。 6. **实体类和映射文件** - ...

    hibernate学习笔记

    ### Hibernate学习笔记:对象/关系数据库映射(二)——集合映射 #### 1. 集合映射概述 在对象/关系映射(ORM)领域中,Hibernate 是一个非常强大的工具,它能够帮助开发者高效地进行 Java 对象与数据库记录之间的...

    Hibernate查询详解

    - 左外连接:`left outer join`,`left join fetch`用于一次性获取关联数据。 - 右外连接:`right outer join`。 - 全连接:`full join`,在Hibernate中较少使用。 了解并熟练掌握这些Hibernate查询机制,能够...

    hibernate.properties

    ## set the maximum depth of the outer join fetch tree hibernate.max_fetch_depth 1 ## set the default batch size for batch fetching #hibernate.default_batch_fetch_size 8 ## rollback generated ...

    HQL语句大全

    - 示例:`from Cat as cat join fetch cat.mate left join fetch cat.kittens`。 - **限制**:`fetch`连接不能在使用`scroll()`或`iterate()`方法的查询中使用;也不能使用`full join fetch`或`right join fetch`。...

    hibernate 中HQL语句查询学习笔记

    SELECT s, c FROM Student s LEFT OUTER JOIN FETCH s.courses c; ``` 这里使用了`FETCH`关键字来立即加载关联数据。 ##### 右外连接 与左外连接相反,右外连接会返回右表的所有记录,并尽可能地与左表的记录匹配...

    Hibernate HQL教程

    SELECT s, c FROM Student s LEFT OUTER JOIN FETCH s.courses c ON c.cno = sc.cno; ``` - **解释**: 左外抓取连接会立即加载关联对象,提高性能。 ##### 1.4.7 右外连接 - **语法**: ```hql SELECT s, c FROM...

    hibernate_3配置文件参数汇总

    - `hibernate.max_fetch_depth`:控制外连接加载(outer join fetch)的深度,限制了级联加载的对象层次。 - `hibernate.default_batch_fetch_size`:设置默认的批量获取大小,优化关联查询的效率。通常建议的值是...

    Hibernate教程

    4.4.2. 外连接抓取(Outer Join Fetching) 4.4.3. 二进制流 (Binary Streams) 4.4.4. 二级缓存与查询缓存 4.4.5. 查询语言中的替换 4.4.6. Hibernate的统计(statistics)机制 4.5. 日志 4.6. 实现NamingStrategy...

    Hibernate查询语言(HQL)

    - **FETCH 子句**:FETCH 子句可以显式地告诉 Hibernate 加载关联的数据。 ```sql FROM com.example.Cat AS cat INNER JOIN FETCH cat.mate; ``` 使用 FETCH 可以提高查询效率,避免多次查询数据库加载关联...

    hibernate3.2中文文档(chm格式)

    3.4.2. 外连接抓取(Outer Join Fetching) 3.4.3. 二进制流 (Binary Streams) 3.4.4. 二级缓存与查询缓存 3.4.5. 查询语言中的替换 3.4.6. Hibernate的统计(statistics)机制 3.5. 日志 3.6. 实现NamingStrategy...

    hibernate hql基本操作

    - **左外连接**:`left outer join`允许在左侧实体未找到匹配项时返回null值,例如`left outer join cat.kittens as kitten`。 - **右外连接**:`right outer join`与左外连接相反,如果右侧实体未找到匹配项,则...

    Hibernate+中文文档

    3.4.2. 外连接抓取(Outer Join Fetching) 3.4.3. 二进制流 (Binary Streams) 3.4.4. 二级缓存与查询缓存 3.4.5. 查询语言中的替换 3.4.6. Hibernate的统计(statistics)机制 3.5. 日志 3.6. 实现NamingStrategy...

    HQL Hibernate查询语言

    HQL(Hibernate Query Language)是 Hibernate 中的一种强大的查询语言,它看起来很像 SQL,但是不要被语法结构上的相似所迷惑,HQL 是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态和关联之类的...

    hibernate延迟加载技术详细解

    1. **Join Fetching**:这是一种将主表与关联表通过 OUTER JOIN 连接起来的方式进行查询。这种方式通常用于查询所有相关联数据时使用,可以减少查询次数,但可能会导致返回的结果集过大。 - 实现方式:可以通过 HQL...

    Hibernate 参数设置一览表(强烈推荐)

    18. **hibernate.use_outer_join Fetching**:如果设置为`true`,Hibernate将尽可能使用外连接进行关联加载,但这可能导致SQL效率降低。 19. **hibernate.connection.release_mode**:控制何时释放数据库连接,例如...

Global site tag (gtag.js) - Google Analytics