首页 > hibernate join fetch

hibernate join fetch

那天去了达内,试听了2个小时的课,刚好讲的他们的当当网项目,讲hibernate表关系映射这段来了,不过也够呛,投影仪看的眼睛点都不舒服,当时讲的也没认真听,听了个大概,就记住那个老师一句话了,说是有经验的人用的,一般人不告诉,就是说这个join fetch 用法,回来查了一下,用起来比较爽,今晚突然来了兴致,小记一下。

join fetch 其实是相当于 数据库 里面的连接部分。默认是inner join 。也支持left outer join。

join fetch 主要是运用于 HQL 中。

主要体现在一对多、多对多的关系表中

例如:

class Student{

private int id;

private int name;

private Team team;

get{…} ;  set{…};

}

class Team{

private int tid;

private String name;

private Set students;

get{…}; set{…}';

}

默认查询Team 的时候,fetch=lazy,不会去查询 Team 中所有的Student.

----------------查询---------------------

Team t=(Team)session.load(Team.class, 3);

        Set sets=t.getStudents();

        for(Student s:sets){

            System.out.println(s.getId()+"   "+s.getName());

        }

----------------查询结果-----------------

Hibernate:

    select

        team0_.cid as cid0_0_,

        team0_.name as name0_0_

    from

        team0_

    where

        team0_.cid=?

Hibernate:

    select

        students0_.cid as cid0_1_,

        students0_.id as id1_,

        students0_.id as id1_0_,

        students0_.cid as cid1_0_,

        students0_.name as name1_0_

    from

        Student students0_

    where

        students0_.cid=?

-----------------------------------------

所以会去查询2次,第一次去查询指定的Team,第二次会查询指定Team下所有的Student.

使用Join fetch 是为了减少查询的次数。

 

----------------查询---------------------

List lists = session.createQuery("from Team t  join fetch c.students order by t.cid").list();

        for(Team t : lists){

            System.out.println(t.getCid()+ "   "+t.getName()+"   ");

                for(Student s:t.getStudents()){

                    System.out.println("      "+s.getId()+"   "+ s.getName() +"   "+s.getTeam().getCid());

                }

        }

----------------查询结果-----------------

Hibernate:

    select

        team0_.cid as cid0_0_,

        students1_.id as id1_1_,

        team0_.name as name0_0_,

        students1_.cid as cid1_1_,

        students1_.name as name1_1_,

        students1_.cid as cid0_0__,

        students1_.id as id0__

    from

        team class0_

    inner join

        Student students1_

            on team0_.cid=students1_.cid

    order by

        team0_.cid

-----------------------------------------

结果发现只发错一条SQL语句。经鉴定,Join fetch 是为了用来减少查询次数的。

实质是就是使用了数据库的join.

鉴定完毕。

转载于:https://www.cnblogs.com/huangjingzhou/articles/1876213.html

更多相关:

  •     最近一直在学习三层架构,前些天同样也写了一篇同样的博客,今天主要是通过一个登录的实例给大家讲解每部分的作用和相应代码的实现。     先将实现三层架构的UML图给大家,帮助大家更好的理解三层。               1. UI作用 (1) 向用户展示特定业务数据 (2) 采集用户的输入信息和操作 Publ...

  •  经常看见MOP上有人贴那种动态的图片,就是把一个字符串作为参数传给一个动态网页,就会生成一个带有这个字符串的图片,这个叫做文字水印。像什么原来的熊猫系列,还有后来的大树和金条,都挺有意思。这东西看着挺好玩的,想做个玩玩。查了查资料,发现用.net来做这个是很容易的,就用Asp.net写了一个非常简单的。全部的代码如下: <%@...

  •           这两天在和斌做后台中的报表,暂定使用水晶报表,目前还只是处于对水晶报表的初级应用阶段,也就是知道如何 汇个总、写个函数、传个参数。           问题总是层出不穷,在最后整合报表,进行报表显示测试的时候,发现每次更新数据显示(除第一次)时都会蹦出一个“登录数据库的信息提示界面”很是苦闷,并且这肯�...

  •  1 2 3   4    Y 5    c:adFile 6    

  • 关注我的头条号,获取更多运维相关知识。你想了解哪方面的运维知识,请评论区告诉我,我会尽快更新~MySQL 数据库,基本上运维都会接触到,而对于数据库的性能优化,想必是大家比较关注的,下面分享一些调优技巧。先决条件安装 MySQL,版本大于 5.7有部分数据操作系统、数据库管理员权限MySQL 系统性能优化在系统层面,调整硬件和软件选项...

  • spring data jpa提供了多种查询方式,如下:方法名称查询继承Repository接口测试代码方法名称中支持的关键字(官方文档提供)使用JPA命名查询在User实体中定义jpql(类似于hql)jpql(百度百科)继承JpaRepository接口测试使用@Query查询和命名查询不同的是,将jpql写到了 dao 方法上,...

  • 转自:http://www.cnblogs.com/fish-li/archive/2011/06/06/2073626.html   对于SqlServer的优化来说,可能优化查询是很常见的事情。关于数据库的优化,本身也是一个涉及面比较的广的话题,本文只谈优化查询时如何看懂SqlServer查询计划。由于我对SqlServer的认识...

  • 一.实现基础功能之一(记账)   一个记账本最基础之一的功能就是记账,所以也是首先要解决的问题,我选择了上学期使用的MySQL数据库来对账本进行存储。   我选择记账的方法是分开记账,就是支出放在一个表,收入放在一个表,这样在数据库方面会比较的直观的看到,但是在显示的时候就会产生部美观的问题,就是支出和收入都是分开来的,没有办法按照时...

  • 在Navicat中,我们选中一个表,双击打开,这是如果要新建查询这个表的sql语句,可以直接用快捷键  ctrl+q  会自动打开查询窗口,并直接写好 sql:select * from (当前打开的表名) 我们直接在后面补全查询条件即可,非常方便。 转载于:https://www.cnblogs.com/libin6505/...