那天去了达内,试听了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<Student> students;

get{…}; set{…}';

}

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

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

Team t=(Team)session.load(Team.class, 3);
        Set<Student> 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<Class> 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

hibernate join fetch相关推荐

  1. hibernate left join fetch 出错的问题

    1.首先说说manyToOne的问题 比如一个用户所在的组织机构,可能是多个,最多是四个,然后userEntity有下的代码: 关联查询: 第一种方式:代码如下 StringBuilder sql = ...

  2. Hibernate的fetch

    hibernate抓取策略fetch具体解释 一.hibernate抓取策略(单端代理的批量抓取fetch=select(默认)/join) 測试用例: Student student = (Stud ...

  3. FW: How to use Hibernate Lazy Fetch and Eager Fetch Type – Spring Boot + MySQL

    原帖 https://grokonez.com/hibernate/use-hibernate-lazy-fetch-eager-fetch-type-spring-boot-mysql In the ...

  4. left join fetch 用法实例记录

    left join fetch 应用:查找BusinessVersion表中的信息时同时抓取关联的BusinessOrganInfo信息,记录下来以备后用: BusinessVersion.java ...

  5. Hibernate5-多对1(n:1)-fetch=join

    1.创建项目,项目名称hibernatedemo26,目录结构如图所示 2.在项目中创建lib目录存储jar文件,目录结构如图所示 3.在src目录中创建实体类Forum,包名(com.mycompa ...

  6. Hibernate(十三)迫切内连接fetch

    迫切内连接fetch 内连接和迫切内连接的区别: 其主要区别就在于封装数据,因为他们查询的结果集都是一样的,生成底层的SQL语句也是一样的. 1.内连接:发送就是内连接的语句,封装的时候将属于各自对象 ...

  7. Hibernate中的fetch

    fetch参数指定了关联对象抓取的方式是select查询还是join查询,select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形 ...

  8. hibernate fetch属性

    2019独角兽企业重金招聘Python工程师标准>>> Hibernate的fetch="join"和fetch="select" 的一点分析 ...

  9. Hibernate之检索方式

    时间:2017-1-22 16:09 --检索方式 Hibernate中提供了以下几种检索对象的方式:     *   导航对象图检索方式         根据已经加载额对象导航到其他对象.      ...

最新文章

  1. JAR文件——2017.08.04
  2. mpvue开发小程序分享朋友圈无法自定义标题解决方法
  3. 北大青鸟c语言课后答案,北大青鸟C语言教程--第一章 C语言基础.ppt
  4. ASP.Net快速开发新闻系统 在线播放
  5. Spring获取JavaBean的xml形式和注解形式
  6. 【elasticsearch系列】安装elasticsearch-head插件
  7. (49)System Verilog字符串string详解
  8. 它们才是真正的数学家 寻找自然界中的数学
  9. html类名定义规则_好程序员分享Java语言中的标识符规则
  10. linux salt命令 -e,Linux记录-salt命令
  11. caffe编译关于imread问题的解决
  12. UBUNTU使用GITHUB
  13. android 模拟内存不足,雷电模拟器内存不足怎么办?雷电安卓模拟器怎么修改内存大小?...
  14. 德雷塞尔大学计算机科学专业,美国大学计算机科学专业排名如何
  15. My Forty-eighth Page - 组合 - By Nicolas
  16. 分门别类刷leetcode——链表(C++实现)
  17. 微信企业号开发模式的PHP代码
  18. Spring源码解析(五)-Bean的实例化流程(上)
  19. 数据查询和业务流分开_一文带你了解大数据管道
  20. 投影向量计算公式的推导

热门文章

  1. abaqus高性能服务器怎么用,高性能计算平台ABAQUS任务调度使用说明作者陈林E-Mailchenlin.PDF...
  2. java 购物车价格类型_WooCommerce - 为购物车中的每个产品添加自定义价格
  3. mysql 附近3公里的_mysql搜寻附近N公里内数据的实例
  4. 0基础小白学好JAVA的5个方法
  5. 和12岁小同志搞创客开发:手撕代码,做一款遥控灯
  6. 和12岁小同志搞创客开发:如何驱动LED数码管?
  7. RTD 比率式温度测量传感器设计思路
  8. 10行Python代码实现Web自动化管控
  9. 洛谷P1896 [SCOI2005]互不侵犯 状压dp+位运算
  10. python图像中如何显示中文