`

Join用法,HQL的方法,Hibernate中的fetch

阅读更多
Join用法,HQL的方法,Hibernate中的fetch


Join用法:

主要有Inner Join 及 Outer Join:

 

最常用的(默认是Inner):

Select <要选择的字段> From <主要资料表>

  <Join 方式> <次要资料表> [On <Join 规则>]

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 资料表的资料

 

另外,还有全外联:

FULL JOIN 或 FULL OUTER JOIN

 

完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

 

以及,

交叉联接

交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。

没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。也就是说在没有 WHERE 子句的情况下,若表 A 有 3 行记录,表 B 有 6 行记录 : :

SELECT A.*,B.* FROM 表A CROSS JOIN 表B

那以上语句会返回 18 行记录。

 

 

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了

 

 

分享到:
评论

相关推荐

    Hibernate+中文文档

    7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. ...

    Hibernate中文详细学习文档

    7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. ...

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

    7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. ...

    Hibernate 中文 html 帮助文档

    7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. 双向...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 实体域对象的其他持久化模式  2.3.1 主动域对象模式  2.3.2 JDO模式  2.3.3 CMP模式  2.4 Hibernate API简介  2.4.1 Hibernate的核心接口  ...

    HibernateAPI中文版.chm

    7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. ...

    最全Hibernate 参考文档

    7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. 双向...

    hibernate总结

    b) 在hql中要使用迫切左外连接时,必须加 left join fetch 对象.关系属性 i. 如果不加fetch关键字,则hibernate不会抓取关系属性,但会遍历关系属性所对应的表 ii. 不加fetch关键字时,select 要指定返回的对象,...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 实体域对象的其他持久化模式  2.3.1 主动域对象模式  2.3.2 JDO模式  2.3.3 CMP模式  2.4 Hibernate API简介  2.4.1 Hibernate的核心接口  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 实体域对象的其他持久化模式  2.3.1 主动域对象模式  2.3.2 JDO模式  2.3.3 CMP模式  2.4 Hibernate API简介  2.4.1 Hibernate的核心接口  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 实体域对象的其他持久化模式  2.3.1 主动域对象模式  2.3.2 JDO模式  2.3.3 CMP模式  2.4 Hibernate API简介  2.4.1 Hibernate的核心接口  ...

    hibernate3.04中文文档.chm

    8.3. 使用连接表的单向关联(Unidirectional associations with join tables) 8.3.1. 一对多(one to many) 8.3.2. 多对一(many to one) 8.3.3. 一对一(one to one) 8.3.4. 多对多(many to many) 8.4. ...

    hibernate 体系结构与配置 参考文档(html)

    14. HQL: Hibernate查询语言 14.1. 大小写敏感性问题 14.2. from子句 14.3. 关联(Association)与连接(Join) 14.4. join 语法的形式 14.5. select子句 14.6. 聚集函数 14.7. 多态查询 14.8. where子句 14.9....

    Hibernate教程

    8.3. 使用连接表的单向关联(Unidirectional associations with join tables) 8.3.1. 一对多(one to many) 8.3.2. 多对一(many to one) 8.3.3. 一对一(one to one) 8.3.4. 多对多(many to many) 8.4. ...

    Hibernate3+中文参考文档

    7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. 双向...

    hibernate.properties

    #hibernate.query.factory_class org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory ################# ### Platforms ### ################# ## JNDI Datasource #hibernate.connection....

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. ...

    Hibernate注释大全收藏

    Hibernate 可以对类的属性或者方法进行注解。属性对应field类别,方法的 getXxx()对应property类别。 定义表 通过 @Table 为实体Bean指定对应数据库表,目录和schema的名字。 @Entity @Table(name="tbl_sky") ...

    Hibernate Reference Documentation3.1

    14. HQL: The Hibernate Query Language 14.1. Case Sensitivity 14.2. The from clause 14.3. Associations and joins 14.4. Forms of join syntax 14.5. The select clause 14.6. Aggregate functions 14.7. ...

Global site tag (gtag.js) - Google Analytics