`
lewis219
  • 浏览: 14227 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

fetch="join" 和fetch="select"

阅读更多
fetch参数指定了关联对象抓取的方式是select查询还是join查询,select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询;
而join方式,主体对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。
如果你的关联对象是延迟加载的,它当然不会去查询关联对象。
另外,在hql查询中配置文件中设置的join方式是不起作用的(而在所有其他查询方式如get、criteria或再关联获取等等都是有效的),会使用select方式,除非你在hql中指定join fetch某个关联对象。

fetch策略用于定义 get/load一个对象时,如何获取非lazy的对象/集合。 这些参数在Query中无效。

fetch策略用于定义 get/load一个对象时,如何获取非lazy的对象/集合。 这些参数在Query中无效。

在某种特殊的场合下,fetch在hql中还是起作用的。
例如
现有message(回帖)-->topic(主贴)-->forum(版块) 的多级many-to-one结构:
第一级:message-->topic many-to-one配置lazy="false" fetch="join"
第二级:topic-->forum many-to-one配置lazy="false" fetch="join"
这时如果"from message",则第二级:topic-->forum中的fetch策略会起作用

查询抓取(默认的)在N+1查询的情况下是极其脆弱的,因此我们可能会要求在映射文档中定义使用连接抓取:

<set name="permissions"
fetch="join">
<key column="userId"/>
<one-to-many class="Permission"/>
</set
<many-to-one name="mother" class="Cat" fetch="join"/>
在映射文档中定义的抓取策略将会有产生以下影响:

通过get()或load()方法取得数据。

只有在关联之间进行导航时,才会隐式的取得数据(延迟抓取)。

条件查询

在映射文档中显式的声明 连接抓取做为抓取策略并不会影响到随后的HQL查询。

通 常情况下,我们并不使用映射文档进行抓取策略的定制。更多的是,保持其默认值,然后在特定的事务中, 使用HQL的左连接抓取(left join fetch) 对其进行重载。这将通知 Hibernate在第一次查询中使用外部关联(outer join),直接得到其关联数据。 在条件查询 API中,应该调用 setFetchMode(FetchMode.JOIN)语句。


其实这并不能说明hql能够按照配置文件设置的join进行抓取,这时 第二级:topic-->forum 的抓取其实已经和hql没有关系了,因为前面已经产生了另一个select方式的抓取语句。
而是对象的关联获取,假如查询message时topic是设置为延迟加载的,那么在后面获取message.topic时,如topic.forum不延迟加载,那么topic-->forum会实现配置的join方式的抓取,这个显然和hql查询没有关系 
分享到:
评论

相关推荐

    j2ee英文面试

    - fetch=join:使用外连接来获取关联的实例/集合。 - fetch=select:这是默认选项。如果存在'n'个关联对象,则将会执行'n+1'个select语句。如果懒加载(lazy)属性设置为true,则这些语句只有在实际需要关联时才会...

    HIBERNATE检索策略

    默认抓取策略(Fetch="select") 这是HIBERNATE默认的抓取策略,当一个实体被加载时,与之关联的实体或集合并不会立即加载,而是采用延迟加载(Lazy Loading)的方式。当第一次访问关联实体或集合时,HIBERNATE会...

    Hibernate笔记

    - **Fetch="join"**: 指定使用`JOIN FETCH`策略,即在加载主对象的同时,通过`JOIN`语句一次性加载关联对象。这可以减少数据库查询次数,但在对象关联复杂时可能导致性能问题。 - **XML配置示例**: ```xml ...

    sql 游标、存储过程

    select a.*, b.usingType_code, b.sOrderNo from t_desk a left join t_using_desk b on a.id = b.desk_id go --新建台号时向 t_using_desk 插入记录 --台号显示的时候查 v_desk --去掉表 t_dish_...

    Hibernate 1+N问题详解

    "select s from Student s join fetch s.teacher") .list(); ``` **3. 手动控制加载行为:** ```java List&lt;Student&gt; students = (List) session.createCriteria(Student.class) .setFetchMode("teacher", ...

    Hibernate延迟加载

    使用`fetch="select"`会禁用延迟加载,而`fetch="join"`则会导致连接查询,可能影响性能。 #### 四、注意事项 - **Session管理**:延迟加载的效果受限于Session的生命周期,确保在访问延迟加载的对象前,Session...

    Hibernate延迟加载原理与实现方法

    - 对于单端关联(`&lt;many-to-one&gt;`, `&lt;one-to-one&gt;`),可以使用`fetch`属性控制加载方式,如`fetch="join"`会在同一SQL语句中使用内连接获取关联数据,`fetch="select"`则使用延迟加载。 - 集合属性上的抓取策略...

    Hibernate延迟加载以及利用Spring

    1. **修改Fetch策略**:将Fetch策略设置为`fetch="join"`,即在查询主对象的同时通过JOIN查询的方式加载关联对象,这样就不会抛出延迟加载异常。 2. **禁用延迟加载**:将`lazy="false"`,这样就会在查询主对象时...

    hibernate_many2one

    为了避免这种情况,可以考虑使用`fetch="join"`或`fetch="select"`策略,前者会在加载实体时同时加载其所有关联实体,后者则按需加载。 #### 6. 映射策略 除了基本的`&lt;many-to-one&gt;`映射外,Hibernate还支持多种...

    hibernate 框架的基础四

    Query query = session.createQuery("FROM Order o LEFT JOIN FETCH o.customer c WHERE o.id = :orderId"); query.setParameter("orderId", orderId); List&lt;Order&gt; orders = query.list(); ``` #### 二、事务...

    hsql查询语法

    HSQL支持的连接类型包括inner join、left outer join、right outer join和full join。例如: from Formula form full join form.parameter param 4. FETCH连接 HSQL还支持FETCH连接,用于将关联的对象或一组值的...

    SQL_select.rar_sql 语法

    9. **TOP, LIMIT或FETCH FIRST子句**:根据数据库系统,用于限制返回的结果行数。例如,在SQL Server中: ``` SELECT TOP n column1 FROM table_name; ``` 在MySQL中: ``` SELECT column1 FROM table_name ...

    SQL+SERVER精华查询语句.pdf

    实现这一点通常需要使用`JOIN`操作连接教师表、课程表、选课表和学生表。 **示例代码**: ```sql DECLARE @start TABLE (sStudentId VARCHAR(50), sBookName VARCHAR(255)); DECLARE @sStudentId VARCHAR(50); ...

    hibernate的n+1问题.docx

    此外,我们还可以在实体映射文件中通过`lazy="true"`或`fetch="join"`等属性来设定默认的检索策略。但需要注意,过度使用迫切加载可能导致大数据量的内存消耗,因此应结合具体业务场景选择合适的检索策略。 总结,...

    Hibernate_HQL大全

    在这个查询中,我们不仅检索了Cat实体,还通过LEFT JOIN FETCH子句同时加载了它们的mate和kittens。这种方式确保了即使mate或kittens为空,查询也能正确执行,同时避免了多次数据库访问,提高了查询效率。 #### 四...

    SQL sever 实训

    SELECT * FROM Course --有哪些种类的选修课?学分是多少 USE XK GO SELECT Kind,Credit FROM Crouse GO 修改列名字 SELECT '课程种类'=Kind,'学分'=Credit FROM Course GO --查询Course表的前10行 SELECT TOP ...

    hibernate延迟加载技术详细解

    - 实现方式:可以通过 HQL 或 Criteria API 的 `left join fetch` 来实现。 2. **Select Fetching**: - 如果没有显式设置 lazy="false",则默认情况下 Hibernate 使用 Select Fetching,这意味着对于每个主对象...

    sql数据库学习资料

    FETCH NEXT FROM Select_cursor INTO @deptid, @username; -- 循环处理数据 WHILE @@FETCH_STATUS = 0 BEGIN IF EXISTS(SELECT * FROM #Temp2 WHERE deptid = @deptid) UPDATE #Temp2 SET username = username + ...

    hibernate优化前的程序

    应考虑使用`fetch="select"`或`fetch="join"`策略来控制加载行为。 **3. 延时加载的误用**:不合理的延时加载可能导致“懒加载地狱”,即在不期望的时候触发大量数据库请求。评估业务需求,合理设置加载策略,如...

    hql语句经典教程

    例如,`SeLeCT`、`sELEct`和`SELECT`都是等效的。然而,类的全限定名和属性名必须保持正确的大小写,如`org.hibernate.eg.Foo`不同于`org.hibernate.eg.Foo`,且`foo.barSet`与`foo.BARSET`不相同。在本教程中,建议...

Global site tag (gtag.js) - Google Analytics