Hibernate 迫切连接和普通连接的区别
package com.baidu.test;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.baidu.leftJoin.Department;
import com.baidu.leftJoin.Employee;
public class TestHQL_LeftJoin {
    
    private SessionFactory sessionFactory;
    private Session session;
    private Transaction transaction;
    
    
    @Before
    public void init(){
        Configuration configuration = new Configuration().configure();
        ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
                                        .applySettings(configuration.getProperties())
                                        .buildServiceRegistry();
        
        sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        
        session = sessionFactory.openSession();
        transaction = session.beginTransaction();
    }
    @After
    public void destroy(){
        transaction.commit();
        session.close();
        sessionFactory.close();
        
    }
    
//  ~~~~~~~~~~~~~~~~~~~~~~~~~~下面的例子是 从 1 对  多   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    /**
     * 
     * 迫切左外连接: 特点是:如果左表有不满足条件的,也返回左表不满足条件
     *        1. LEFT JOIN FETCH 关键字表示迫切左外连接检索策略.
     *        2. list() 方法返回的集合中存放实体对象的引用, 每个 Department 对象关联的 Employee 集合都被初始化,
     *             存放所有关联的 Employee 的实体对象. 
     *        3. 查询结果中可能会包含重复元素, 可以通过一个 HashSet 来过滤重复元素
     * 
     *         去重:
     *             方法一:使用 distinct
     *                 String hql  = "SELECT DISTINCT d FROM  Department d LEFT JOIN FETCH d.emps ";
     *                Query query = session.createQuery(hql);
     *
     *                List<Department> depts = query.list();
     *                System.out.println(depts.size());
     *             
     *             方法二
     *                  String hql  = "FROM  Department d LEFT JOIN FETCH d.emps ";
     *                Query query = session.createQuery(hql);
     *
     *                List<Department> depts = query.list();
     *
     *                depts = new ArrayList<>(new LinkedHashSet(depts));
     *                System.out.println(depts.size());
     *                
     *                for(Department dept:depts){
     *                    System.out.println(dept.getName() + "--" + dept.getEmps().size() );
     *                }
     * 
     * 
     */
    @Test
    public void testLeftJoinFetch(){
//        String hql  = "SELECT DISTINCT d FROM  Department d LEFT JOIN FETCH d.emps ";
//        Query query = session.createQuery(hql);
//        
//        List<Department> depts = query.list();
//        System.out.println(depts.size());
//        
        
        
        String hql  = "FROM  Department d LEFT JOIN FETCH d.emps ";
        Query query = session.createQuery(hql);
        
        
        List<Department> depts = query.list();
        System.out.println(depts.size());
        
        depts = new ArrayList<>(new LinkedHashSet(depts));
        System.out.println(depts.size());
        
        for(Department dept:depts){
            System.out.println(dept.getName() + "--" + dept.getEmps().size() );
        }
    }
    
    
    /** 
     * 左外连接: 
     *        1. LEFT JOIN 关键字表示左外连接查询. 
     *        2. list() 方法返回的集合中存放的是对象数组类型
     *        3. 根据配置文件来决定 Employee 集合的检索策略. 
     *        4. 如果希望 list() 方法返回的集合中仅包含 Department 对象, 
     *            可以在HQL 查询语句中使用 SELECT 关键字
     *        
     *        这样的语句查询的结果有重复:
     *            String hql = "FROM Department d LEFT JOIN d.emps";
     *            Query query = session.createQuery(hql);
     *        
     *            List<Object[]> results = query.list();
     *            System.out.println(results.size());
     *    
     *         去重:
     *             仅能使用  distinct 的方法去除重复
     *     
     *             String hql = "SELECT DISTINCT d FROM Department d LEFT JOIN d.emps";
     *             Query query = session.createQuery(hql);
     * 
     *             List<Department> depts = query.list();
     *             System.out.println(depts.size());
     *                 
     *             for(Department dept:depts){
     *                 System.out.println(dept.getName() + dept.getEmps().size());
     *             }
     * 
     */
    @Test
    public void testLeftJoin(){
        String hql = "SELECT DISTINCT d FROM Department d LEFT JOIN d.emps";
        Query query = session.createQuery(hql);
        
        List<Department> depts = query.list();
        System.out.println(depts.size());
        
        for(Department dept:depts){
            System.out.println(dept.getName() + dept.getEmps().size());
        }        
        
    }
    
    /**
     * 迫切内连接: 特点是:不返回左表不满足条件
     *        INNER JOIN FETCH 关键字表示迫切内连接, 也可以省略 INNER 关键字
     *        list() 方法返回的集合中存放 Department 对象的引用, 每个 Department 
     *                对象的 Employee 集合都被初始化, 存放所有关联的 Employee 对象
     * 
     * 内连接:
     *        INNER JOIN 关键字表示内连接, 也可以省略 INNER 关键字
     *        list() 方法的集合中存放的每个元素对应查询结果的一条记录, 每个元素都是对象数组类型
     *        如果希望 list() 方法的返回的集合仅包含 Department  对象, 可以在 HQL 查询语句中使用 SELECT 关键字
     *
     * 
     * 
     */
    @Test
    public void testInnerJoinFetch(){
        //String hql  = "SELECT DISTINCT d FROM  Department d LEFT JOIN FETCH d.emps ";
        String hql  = "FROM  Department d INNER JOIN FETCH  d.emps ";
        Query query = session.createQuery(hql);
        
        
        List<Department> depts = query.list();
        depts = new ArrayList<>(new LinkedHashSet(depts));
        System.out.println(depts.size());
        
        for(Department dept:depts){
            System.out.println(dept.getName() + "--" + dept.getEmps().size() );
        }
    }
    
    
//  ~~~~~~~~~~~~~~~~~~~~~~~~~~下面的例子是 从多 对  1   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    @Test
    public void testLeftJoinFetch2(){
        String hql = "FROM Employee e LEFT JOIN FETCH e.dept";
        Query query = session.createQuery(hql);
        
        List<Employee> emps = query.list();
        System.out.println(emps.size());
        
        for(Employee emp:emps){
            System.out.println(emp + " -- " + emp.getDept());
        }
        
    }
}
Hibernate 迫切连接和普通连接的区别的更多相关文章
- Http 和TCP的关系,TCP长连接和短连接有什么区别?
		
HTTP 协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用.由于HTTP在 ...
 - UrlConnection连接和Socket连接的区别
		
关于UrlConnection连接和Socket连接的区别,只知道其中的原理如下: 抽象一点的说,Socket只是一个供上层调用的抽象接口,隐躲了传输层协议的细节. urlconnection 基于H ...
 - SQL Server中内连接和外连接的区别
		
SQL Server中内连接和外连接的区别 假设一个数据库中有两张表,一张是学生表StudentInfo,一张是班级表ClassInfo,两张表之间用ClassId字段进行关联. 如果用内连接,正常的 ...
 - TCP/IP系列——长连接与短连接的区别
		
1 什么是长连接和短连接 三次握手和四次挥手 TCP区别于UDP最重要的特点是TCP必须建立在可靠的连接之上,连接的建立和释放就是握手和挥手的过程. 三次握手为连接的建立过程,握手失败 ...
 - mysql(3)—— 内连接、外连接的区别
		
先来看一下,内连接的语法: SELECT XXX FROM XXX INNER JOIN XXX ON XXX; 这里 INNER 可以省略,在上一篇博客中我们对于笛卡尔积现象的研究中(http:/ ...
 - sql左外连接和右外连接的区别例子转摘
		
sql左外连接和右外连接的区别 两个表:A(id,name)数据:(1,张三)(2,李四)(3,王五)B(id,name)数据:(1,学生)(2,老师)(4,校长) 左连接结果:select A. ...
 - (转载)http和socket之长连接和短连接区别
		
TCP/IPTCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层.在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议.在传输层中有TCP协议与UDP协议.在应用层有: ...
 - HTTP协议原理(长连接,短连接/ get,post区别等等)
		
HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送 ...
 - http和socket之长连接和短连接区别【转】
		
转自:https://blog.csdn.net/mengyafei43/article/details/25195445 TCP/IP TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层 ...
 - sql左外连接、右外连接、group by、distinct(区别)、intersect(交叉)、通配符、having
		
连接条件可在FROM或WHERE子句中指定,建议在FROM子句中指定连接条件.WHERE和HAVING子句也可以包含搜索条件,以进一步筛选连接条件所选的行. 连接可分为以下几类 ...
 
随机推荐
- LogBack log出力路径
			
转自:http://blog.csdn.net/z69183787/article/details/30284391 请看下面这段配置,这是无法工作的: <?xml version=" ...
 - 对js原型对象的拓展和原型对象的重指向的区别的研究
			
我写了如下两段代码: function Person(){} var p1 = new Person(); Person.prototype = { constructor: Person, name ...
 - 判断js对象的数据类型,有没有一个最完美的方法?
			
先来一个例子: var string1=""; var string2=new String(""); alert(typeof string1); // st ...
 - 2.11. 创建托管对象(Core Data 应用程序实践指南)
			
到现在为止,还没有创建过托管对象,回顾了一下,只是创建了托管对象模型,持久化存储区,持久化存储协调器,托管对象上下文. 那么,现在就来创建托管对象吧. 使用NSEntityDescription 的 ...
 - HDU1848-Fibonacci again and again
			
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1848 这个题目代码不是很复杂,但那个等价类,(SG函数)没怎么理解, 题目难,不过代码不怎么复杂,在网 ...
 - hadoop-1.x的运行实例
			
我的环境是hadoop-0.20.2,eclipse:SDK-3.3.2, 源数据为: Apr 23 11:49:54 hostapd: wlan0: STA 14:7d:c5:9e:fb:84 Ap ...
 - SVG的a链接
			
SVG的a链接: <%@ page language="java" contentType="text/html; charset=UTF-8" page ...
 - Cocos2d-x 多分辨率适配完全解析
			
从Cocos2d-x 2.0.4开始,Cocos2d-x提出了自己的多分辨率支持方案,废弃了之前的retina相关设置接口,提出了design resolution概念. 有以下相关接口: CCEGL ...
 - java配置环境变量-及原因
			
为什么java要配置环境变量? 那就要从java的编译和解析过程说起 java文件的编译和解析过程 一.一个hellow.java文件,要经历先编译(变成hellow.class),再解析(解析成机器 ...
 - GreenDao 3.2.0 的基本使用
			
前言 Android开发中我们或多或少都会接触到数据库.Android中提供了一个占用内存极小的关系型数据库-SQLite.虽然Android系统中提供了许多操作SQLite的API,但是我们还是需要 ...