`
wxzauh
  • 浏览: 18158 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Hibernate中,left join、inner join以及left join fetch区别

阅读更多
Inner Join 的主要精神就是 exclusive , 叫它做排他性吧! 就是讲 Join 规则不相符的资料就会被排除掉, 譬如讲在 Product 中有一项产品的供货商代码 (SupplierId), 没有出现在 Suppliers 资料表中, 那么这笔记录便会被排除掉

 

Outer Join:

Select <要查询的字段> From <Left 资料表>

  <Left | Right> [Outer] Join <Right 资料表> On <Join 规则>

 

语法中的 Outer 是可以省略的, 例如你可以用 Left Join 或是 Right Join, 在本质上, Outer Join 是 inclusive, 叫它做包容性吧! 不同于 Inner Join 的排他性, 因此在 Left Outer Join 的查询结果会包含所有 Left 资料表的资料, 颠倒过来讲, Right Outer Join 的查询就会包含所有 Right 资料表的资料

Fetch:

在我们查询Parent对象的时候,默认只有Parent的内容,并不包含childs的信息,如果在Parent.hbm.xml里设置lazy="false"的话才同时取出关联的所有childs内容.
问题是我既想要hibernate默认的性能又想要临时的灵活性该怎么办?  这就是fetch的功能。我们可以把fetch与lazy="true"的关系类比为事务当中的编程式事务与声明式事务,不太准确,但是大概是这个意思。
总值,fetch就是在代码这一层给你一个主动抓取得机会.

Parent parent = (Parent)hibernateTemplate.execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
                Query q = session.createQuery(
"from Parent as parent "+
" left outer join fetch parent.childs " +
" where parent.id = :id"
                );
                q.setParameter("id",new Long(15));
return (Parent)q.uniqueResult();
            }
        });
        Assert.assertTrue(parent.getChilds().size() > 0);

你可以在lazy="true"的情况下把fetch去掉,就会报异常. 当然,如果lazy="false"就不需要fetch了
——————————————————
from:
http://www.javaeye.com/problems/6491
inner join(内连接)

left outer join(左外连接)

right outer join(右外连接)

full join (全连接,并不常用)

语句inner join, left outer join 以及 right outer join 可以简写。
from Cat as cat     join cat.mate as mate    left join cat.kittens as kitten

通过HQL的with关键字,你可以提供额外的join条件。
from Cat as cat     left join cat.kittens as kitten         with kitten.bodyWeight > 10.0

还有,一个"fetch"连接允许仅仅使用一个选择语句就将相关联的对象或一组值的集合随着他们的父对象的初始化而被初始化,这种方法在使用到集合的情况下尤其有用,对于关联和集合来说,它有效的代替了映射文件中的外联接 与延迟声明(lazy declarations).
from Cat as cat     inner join fetch cat.mate    left join fetch cat.kittens

一个fetch连接通常不需要被指定别名, 因为相关联的对象不应当被用在 where 子句 (或其它任何子句)中。同时,相关联的对象 并不在查询的结果中直接返回,但可以通过他们的父对象来访问到他们。
from Cat as cat     inner join fetch cat.mate    left join fetch cat.kittens child    left join fetch child.kittens

假若使用iterate()来调用查询,请注意fetch构造是不能使用的(scroll() 可以使用)。fetch也不应该与setMaxResults() 或setFirstResult()共用,这是因为这些操作是基于结果集的,而在预先抓取集合类时可能包含重复的数据,也就是说无法预先知道精确的行数。fetch还不能与独立的 with条件一起使用。通过在一次查询中fetch多个集合,可以制造出笛卡尔积,因此请多加注意。对bag映射来说,同时join fetch多个集合角色可能在某些情况下给出并非预期的结果,也请小心。最后注意,使用full join fetch 与 right join fetch是没有意义的。

如果你使用属性级别的延迟获取(lazy fetching)(这是通过重新编写字节码实现的),可以使用 fetch all properties 来强制Hibernate立即取得那些原本需要延迟加载的属性(在第一个查询中)。
from Document fetch all properties order by name
from Document doc fetch all properties where lower(doc.name) like ''%cats%''
分享到:
评论

相关推荐

    hsql查询语法

    from Cat as cat inner join fetch cat.mate left join fetch cat.kittens 这个语句将Cat类的实例与其mate和kittens之间的关系进行关联和连接,并将相关联的对象随着父对象的初始化而被初始化。 需要注意的是,...

    HQL Hibernate查询语言

    HQL Hibernate 查询语言 HQL(Hibernate Query Language)是 Hibernate 中的一种强大的查询语言,它看起来很像 SQL,但是不要被...例如:from Cat as cat inner join fetch cat.mate left join fetch cat.kittens。

    Hibernate HQL.doc

    HQL支持四种类型的连接:inner join(内连接)、left outer join(左外连接)、right outer join(右外连接)和full join(全连接)。简写形式如`join`和`left join`也是允许的。`fetch`连接用于一次性初始化相关联...

    Hibernate_HQL大全

    4. **JOIN与ASSOCIATION**:HQL支持INNER JOIN、LEFT OUTER JOIN、RIGHT OUTER JOIN和FULL JOIN四种连接类型。通过JOIN关键字,HQL能够处理实体间的关联,从而实现对关联实体的查询。例如,“JOIN cat.mate as mate...

    hibernate的使用心得

    Hibernate支持多种连接类型,包括`inner join`(内连接)、`left outer join`(左外连接)、`right outer join`(右外连接)和`full join`(全连接)。`with`关键字用于提供额外的连接条件,类似于SQL中的`on`关键字...

    HIBERNATE HQL

    例如,`from Cat as cat inner join fetch cat.mate left join fetch cat.kittens`。 - 使用 `fetch all properties` 可以强制Hibernate立即加载那些默认情况下需要延迟加载的属性,从而提高第一次查询时的数据完整...

    hibernate的hql语句

    连接类型包括:`inner join`(内连接)、`left outer join`(左外连接)、`right outer join`(右外连接)和`full join`(全连接)。`join`的简写形式如`from Cat as cat join cat.kittens as kitten`,简化了查询...

    Hibernate查询语言(HQL)

    - **LEFT OUTER JOIN**:左外连接,返回左侧实体的所有记录,以及右侧实体匹配的记录。 ```sql FROM com.example.Cat AS cat LEFT OUTER JOIN cat.kittens AS kitten; ``` - **FULL JOIN**:全连接,返回两个...

    hibernate 的HQL 语言入门与提高

    HQL 提供了丰富的功能,包括对继承、多态的支持,以及复杂的查询构造,使得在 Hibernate 中处理对象模型变得更为便捷。通过熟练掌握 HQL,开发者可以更有效地进行数据查询,提高代码的可读性和维护性。在实际应用中...

    hql语句经典教程

    from Cat as cat inner join fetch cat.mate left join fetch cat.kittens ``` 这将在查询时初始化关联的伴侣猫和幼猫集合。请注意,`fetch`连接通常不用于`where`子句,也不直接返回结果集,而是通过父对象访问。...

    Hibernate查询语言

    HQL支持多种类型的连接,如内连接(inner join)、左外连接(left outer join)、右外连接(right outer join)和全连接(full join)。例如: ```sql from Cat as cat inner join cat.mate as mate left outer join...

    hibernate 中HQL语句查询学习笔记

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

    hibernate hql基本操作

    在实际应用中,合理运用FROM子句、关联与连接、Fetch连接以及Fetch策略等技巧,可以实现高效的数据检索和处理。 以上是对给定文件中的“hibernate HQL基本操作”的详细解析,希望能够帮助读者更好地理解和掌握HQL的...

    HQL语言教程[归类].pdf

    例如,`from Cat as cat inner join fetch cat.mate left join fetch cat.kittens`。需要注意的是,`fetch`连接不适用于`iterate()`查询,且不应与`setMaxResults()`或`setFirstResult()`一起使用。 总的来说,HQL...

    HQL语句大全

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

    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(); ``` #### 二、事务...

    Hibernate查询语言(HQL) 语法参考

    from Cat as cat inner join fetch cat.mate ``` 这将返回 Cat 类的实例和它的 mate 关联对象,并将相关联的对象初始化。 select 子句 select 子句选择将哪些对象与属性返回到查询结果集中,例如: ``` select cat...

    HQL详解

    其中,`INNER JOIN`、`LEFT OUTER JOIN`和`RIGHT OUTER JOIN`可以简化为: ``` FROM Cat AS cat JOIN cat.mate AS mate LEFT JOIN cat.kittens AS kitten ``` 此外,`FETCH`连接允许在一个选择语句中同时初始化父...

    hql语句大全hql语句大全

    HQL作为一种高度集成的查询语言,不仅简化了数据访问的复杂度,而且通过其丰富的功能,如JOIN和FETCH子句,以及对特定属性的选择,为开发人员提供了灵活的数据检索手段。掌握HQL,意味着能够在Hibernate框架中实现...

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

    - **等值连接**:类似于传统SQL中的`INNER JOIN`,用于两个类之间没有建立任何关联关系的情况,通过属性进行筛选。 - 示例:`FROM Department d, Employee e WHERE d.id = e.departmentId` - **隐式内连接与迫切内...

Global site tag (gtag.js) - Google Analytics