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子句也可以包含搜索条件,以进一步筛选连接条件所选的行. 连接可分为以下几类 ...
随机推荐
- PHP新手之学习数组声明
数组是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的一种形式.这些按序排列的同类数据元素的集合称为数组.下面介绍PHP中的数组声明. 一.数组的概述 1.数组的本质:管理 ...
- Composer PHP依赖管理的新时代
安装Composer Composer需要PHP 5.3.2+才能运行. $ curl -sS https://getcomposer.org/installer | php 这个命令会将compos ...
- CSS控制之IE常见BUG及解决方案
常见bug 解决方案 盒模型bug 使用严格doctype声明 双倍margin bug _display:inline; 不认识a:link 不加:link 3像素margin bug 规范浮动与清 ...
- --@angularJS--独立作用域scope绑定策略之&符策略
1.index.html: <!DOCTYPE HTML><html ng-app="app"><head> <title>s ...
- java 错误 classes路径配置错误
1. 错误显示页 2. 解决步骤 2.1. 查看 root cause 信息 org.springframework.beans.factory.BeanCreationException: Erro ...
- 在DataTable数据类型最后增加一列,列名为“Column”,内容都为“AAA”
DataTable dt = new DataTable(); dt.Columns.Add("Column", typeof(string)); foreach (DataRow ...
- C# winform初学者实例
快递单打印通 下载地址: http://pan.baidu.com/s/1nue5ifn
- 搭建Minisipserve服务器实现局域网内IOS客户端idoubs的通信
idoubs是IOS设备开发的第一款全功能并开放源码的3GPP IMS客户端,它同时专为IOS平台开发设计的voIP测试版客户端,以doubango为框架,能实现当前最先进的多媒体功能,主要功能有:语 ...
- Flex移动皮肤开发(一)
范例文件 mobile-skinning-part1.zip Flex 4.5提供的移动增强的皮肤特性,支持触摸交互.性能优良,并且考虑到了内存占用问题.尽管目前市场上有不少性能优异的设备,但典型的S ...
- POJ1077&&HDU1043(八数码,IDA*+曼哈顿距离)
Eight Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 30127 Accepted: 13108 Special ...