转贴:http://hi.baidu.com/twobrushes/blog/item/711bf124781149054c088ddd.html
fetch参数指定了关联对象抓取的方式是select查询还是join查询,select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询;
fetch策略用于定义 get/load一个对象时,如何获取非lazy的对象/集合。 这些参数在Query中无效。 fetch策略用于定义 get/load一个对象时,如何获取非lazy的对象/集合。 这些参数在Query中无效。 在某种特殊的场合下,fetch在hql中还是起作用的。
查询抓取(默认的)在N+1查询的情况下是极其脆弱的,因此我们可能会要求在映射文档中定义使用连接抓取:
<set name="permissions" 通过get()或load()方法取得数据。 只有在关联之间进行导航时,才会隐式的取得数据(延迟抓取)。 条件查询 在映射文档中显式的声明 连接抓取做为抓取策略并不会影响到随后的HQL查询。 通常情况下,我们并不使用映射文档进行抓取策略的定制。更多的是,保持其默认值,然后在特定的事务中, 使用HQL的左连接抓取(left join fetch) 对其进行重载。这将通知 Hibernate在第一次查询中使用外部关联(outer join),直接得到其关联数据。 在条件查询 API中,应该调用 setFetchMode(FetchMode.JOIN)语句。 其实这并不能说明hql能够按照配置文件设置的join进行抓取,这时 第二级:topic-->forum 的抓取其实已经和hql没有关系了,因为前面已经产生了另一个select方式的抓取语句。 |
转贴:http://hi.baidu.com/twobrushes/blog/item/711bf124781149054c088ddd.html