Hibernate中outer-join、lazy 、fetch join关键字的使用
关键字: outer-join lazy fetch join
1、outer-join关键字(many-to-one的情况)
outer-join关键字有3个值,分别是true,false,auto,默认是auto。
true: 表示使用外连接抓取关联的内容,这里的意思是当使用load(OrderLineItem.class,"id")时,Hibernate只生成一条SQL语句将OrderLineItem与他的父亲Order全部初始化。
select * from OrderLineItem o left join Order p on o.OrderId=p.OrderId where o.OrderLineItem_Id=?
false:表示不使用外连接抓取关联的内容,当load(OrderLineItem.class,"id")时,Hibernate生成两条SQL语句,一条查询OrderLineItem表,另一条查询Order表。这样的好处是可以设置延迟加载,此处要将Order类设置为lazy=true。
select * from OrderLineItem o where o.OrderLineItem_Id=?
select * from Order p where p.OrderId=?
auto:具体是ture还是false看hibernate.cfg.xml中的配置
注意:如果使用HQL查询OrderLineItem,如 from OrderLineItem o where o.id='id',总是不使用外部抓取,及outer-join失效。
2、outer-join(集合)
由于集合可以设置lazy="true",所以lazy与outer-join不能同时为true,当lazy="true"时,outer-join将一直是false,如果lazy="false",则outer-join用法与1同
3、HQL语句会将POJO配置文件中的关联一并查询,即使在HQL语句中没有明确join。
4、In HQL, the "fetch join" clause can be used for per-query specific outer join fetching. One important thing many people miss there, is that HQL queries will ignore the outer-join attribute you specified in your mapping. This makes it possible to configure the default loading behaviour of session.load() and session.get() and of objects loaded by navigating relationship. So if you specify
and then doMyObject obj = session.createQuery("from MyObject").uniqueResult();
obj.getMySet().iterator().next();
you will still have an additional query and no outer-join. So you must explicily request the outer-join fetching:
MyObject obj = session.createQuery(
"from MyObject mo left join fetch mo.mySet").uniqueResult();
obj.getMySet().iterator().next();
Another important thing to know is that you can only fetch one collection reference in a query. That means you can just use one fetch join. You can however fetch "one" references in addition, as this sample from the Hibernate Docs demonstrates:
from eg.Cat as cat
inner join fetch cat.mate
left join fetch cat.kittens
We have once considered lifting this limitation, but then decided against it, because using more than one fetch-join would be a bad idea generally: The generated ResultSet becomes huge and is a major performance loss.
So alltogether the "fetch join" clause is an important instrument Hibernate users should learn how to leverage, as it allows tuning the fetch behaviour of a certain use case.
5、join fetch 与 join 的区别
如果HQL使用了连接,但是没有使用fetch关键字,则生成的SQL语句虽然有连接,但是并没有取连接表的数据,还是需要单独的sql取数据,也就是 select a,b,d...中没有连接表的字段
6、如果集合被声明为lazy=true,在HQL中如果显式的使用 join fetch 则延迟加载失效。
7、在one-to-many的one端显式设置fecth="join",则无论如何都采取预先抓取(生成一个SQl),延迟加载失效(生成两个SQL)
8、many-to-one的延迟加载是在配置文件的class标签设置lazy="true",one-to-many和many-to-many的延迟加载是在set标签中设置lazy="true"。而one-to-one不只要在calss标签设置lazy="true",而且要在one-to-one标签中设置constrained="true".
分享到:
相关推荐
例如,在上面的代码片段中,通过`left outer join fetch parent.childs`语句,我们告诉Hibernate在加载`Parent`实体时,也一并加载所有相关的`Child`实体。这样,即使`Parent`实体的`childs`属性被标记为`lazy="true...
对于集合属性的延迟加载问题,可以通过在映射文件中设置`lazy="false"`关闭延迟加载,或者使用`fetch join`。然而,`fetch join`有一些限制,比如不应与`setMaxResults()`或`setFirstResult()`一起使用,也不能与...
我们也可以为相关联的实体甚至是对一个集合中的全部元素指定一个别名,这时要使用关键字 join。例如:from Cat as cat inner join cat.mate as mate left outer join cat.kittens as kitten。 HQL 支持的连接类型是...
需要注意的是,`fetch`连接不应在使用`scroll()`或`iterate()`的查询中使用,且与`right join fetch`或`full join fetch`的组合无意义。 4. 属性级别的延迟获取(Lazy Fetching): 如果某个对象属性被配置为延迟...
- `outer-join`: 是否使用外联接。 - **双向管理**: - 需要在两边都设置`inverse`和`lazy`。 - `cascade`只能设置为`insert-update`。 - **示例**: - `group1.getRoles().add(role1);` - `role1.getGroups()....
19.1.7. 使用延迟属性抓取(Using lazy property fetching) 19.2. 二级缓存(The Second Level Cache) 19.2.1. 缓存映射(Cache mappings) 19.2.2. 策略:只读缓存(Strategy: read only) 19.2.3. 策略:读/...
- 另一种解决办法是在 HQL 查询或 Criteria 查询中使用 Join Fetching。 4. **配置示例**: - 在映射文件中可以配置 Fetching 策略,如: ```xml <set name="permissions" fetch="join"> <one-to-many class...
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...
- **JOIN抓取**:在SELECT语句中使用OUTER JOIN来获取对象及其关联对象的数据,这种方式可以减少SQL查询次数,但可能增加单次查询的数据量。 ```xml <many-to-one name=".." outer-join="true"/> ``` - **...
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...
19.1.7. 使用延迟属性抓取(Using lazy property fetching) 19.2. 二级缓存(The Second Level Cache) 19.2.1. 缓存映射(Cache mappings) 19.2.2. 策略:只读缓存(Strategy: read only) 19.2.3. 策略:读/...
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...
- **outer-join**:可选属性,默认为 "auto",表示是否使用外连接。 - **fetch**:可选属性,默认为 "select",表示加载策略。 - **persister**:可选属性,表示持久化器类。 - **collection-type**:可选属性,表示...
19.1.7. 使用延迟属性抓取(Using lazy property fetching) 19.2. 二级缓存(The Second Level Cache) 19.2.1. 缓存映射(Cache mappings) 19.2.2. 策略:只读缓存(Strategy: read only) 19.2.3. 策略:读/...
首先,连接抓取(Join fetching)是一种通过在SELECT语句中使用OUTER JOIN来获取关联对象的策略,它能在一次查询中同时获取主对象和关联对象,减少数据库的交互次数。然而,过度使用连接抓取可能导致大结果集,增加...
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...
此外,我们还可以在实体映射文件中通过`lazy="true"`或`fetch="join"`等属性来设定默认的检索策略。但需要注意,过度使用迫切加载可能导致大数据量的内存消耗,因此应结合具体业务场景选择合适的检索策略。 总结,...
外连接抓取(Outer Join Fetching) 3.4.3. 二进制流 (Binary Streams) 3.4.4. 二级缓存与查询缓存 3.4.5. 查询语言中的替换 3.4.6. Hibernate的统计(statistics)机制 3.5. 日志 3.6. 实现NamingStrategy 3.7...
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. 实现...
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...