创建实体类

package cn.bdqn.bean;

import java.util.ArrayList;
import java.util.Date;
import java.util.List; /**
* @author 小豆腐
*
*员工的实体类
*/
public class Emp { private Integer empNo;
private String empName;
private String job;
private Double salary;
private Date hireDate; //多个员工属于一个部门
private Dept dept; public Integer getEmpNo() {
return empNo;
} public void setEmpNo(Integer empNo) {
this.empNo = empNo;
} public String getEmpName() {
return empName;
} public void setEmpName(String empName) {
this.empName = empName;
} public String getJob() {
return job;
} public void setJob(String job) {
this.job = job;
} public Double getSalary() {
return salary;
} public void setSalary(Double salary) {
this.salary = salary;
} public Date getHireDate() {
return hireDate;
} public void setHireDate(Date hireDate) {
this.hireDate = hireDate;
} public Dept getDept() {
return dept;
} public void setDept(Dept dept) {
this.dept = dept;
} public Emp(Integer empNo, String empName, String job, Double salary,
Date hireDate, Dept dept) {
super();
this.empNo = empNo;
this.empName = empName;
this.job = job;
this.salary = salary;
this.hireDate = hireDate;
this.dept = dept;
} public Emp() {
super();
} @Override
public String toString() {
return "Emp [empNo=" + empNo + ", empName=" + empName + ", job=" + job
+ ", salary=" + salary + ", hireDate=" + hireDate + ", dept="
+ dept + "]";
}
}
package cn.bdqn.bean;

import java.util.HashSet;
import java.util.Set; import com.sun.org.apache.bcel.internal.generic.NEW; /**
*
* 部门的实体类
*/
public class Dept { private Integer deptNo;
private String deptName;
private String location;
//一个部门对应多个员工
private Set<Emp> emps=new HashSet<>();
public Integer getDeptNo() {
return deptNo;
}
public void setDeptNo(Integer deptNo) {
this.deptNo = deptNo;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public Set<Emp> getEmps() {
return emps;
}
public void setEmps(Set<Emp> emps) {
this.emps = emps;
}
public Dept(Integer deptNo, String deptName, String location, Set<Emp> emps) {
super();
this.deptNo = deptNo;
this.deptName = deptName;
this.location = location;
this.emps = emps;
}
public Dept() {
super();
}
@Override
public String toString() {
return "Dept [deptNo=" + deptNo + ", deptName=" + deptName
+ ", location=" + location + ", emps=" + emps.size() + "]";
} }

创建对应的数据库表

创建对应的映射文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.bdqn.bean">
<class name="Dept">
<id name="deptNo">
<generator class="assigned"/><!-- 手动给主键赋值 -->
</id>
<property name="deptName" column="dName"/>
<property name="location" column="loc"/>
<!-- 设置一对多
name:本类中的关联属性名 集合的名称
column: 就是数据库表中的外键
order-by="id desc" 按照 街道的id 进行 降序排列
inverse:是由谁来维护表与表之间的关系! 默认是false!(维护) true(不维护)
-->
<set name="emps" cascade="all" inverse="true">
<key column="DEPTNO"/>
<one-to-many class="Emp"/>
</set>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.bdqn.bean">
<class name="Emp">
<id name="empNo">
<generator class="assigned"/><!-- 手动给主键赋值 -->
</id>
<property name="empName"/>
<property name="job"/>
<property name="salary"/>
<property name="hireDate"/>
<!-- 配置多对一关联
name:对应的是 本类中 关联关系的属性名
column:对应数据库中 两个表的 外键!
class:关联的实体类
-->
<many-to-one name="dept" column="DEPTNO" class="Dept"/>
</class>
</hibernate-mapping>

在hibernate.cfg.xml文件中 管理两个映射文件之后,创建测试类代码

public class EmpTest {
Session session =null;
Transaction transaction=null; @Before
public void before(){
session = HibernateSessionUtil.getCurrentSession();
transaction= session.beginTransaction();
} /**
* 先给两个表中 增加测试数据
*/
@Test
public void testAdd(){
/**
* 因为我们设置了级联操作 cascade=all
* 那么我们就可以在保存部门信息的时候保存员工
*/
Dept dept=new Dept();
dept.setDeptNo(2);
dept.setDeptName("市场部");
dept.setLocation("2楼");
//创建员工
Emp emp1=new Emp(5, "员工5", "程序猿5", 5000.0,dept);
Emp emp2=new Emp(6, "员工6", "程序猿6", 545000.0,dept);
Emp emp3=new Emp(7, "员工7", "程序猿7", 2000.0,dept);
Emp emp4=new Emp(8, "员工8", "程序猿8", 98000.0,dept);
Set<Emp> emps=new HashSet<>();
emps.add(emp1);
emps.add(emp2);
emps.add(emp3);
emps.add(emp4);
dept.setEmps(emps); //把所有的员工放入了集合中
session.save(dept);
transaction.commit();
} /**
* 所有的迫切连接返回的都是一个对象! 有fetch===》迫切连接
* 所有的非迫切连接返回的都是一个数组!
*
*
* 01.使用内连接查询 两个表的所有数据
* sql语句
* select * from emp inner join dept
on dept.deptno=emp.deptno hql语句
from Emp e inner join e.dept(Emp类中的关联属性名)
*/
@Test
public void test01(){
String hql="from Emp e inner join e.dept";
List<Object[]> list = session.createQuery(hql).list();
for (Object[] objects : list) {
System.out.println(objects[0]); //Emp对象
System.out.println(objects[1]); //Dept对象
}
} /**
* 02.迫切内连接 返回的就是一个对象
*/
@Test
public void test02(){
String hql="from Emp e inner join fetch e.dept";
List<Emp> list = session.createQuery(hql).list();
for (Emp emp : list) {
System.out.println(emp); //Emp对象
}
}
/**
* 03.隐式内连接 返回的就是一个对象
* e.dept.deptNo 通过这个属性 进行关联连接
*/
@Test
public void test03(){
String hql="from Emp e where e.dept.deptNo=:dNo";
List<Emp> list = session.createQuery(hql).setParameter("dNo", 2).list();
for (Emp emp : list) {
System.out.println(emp); //Emp对象
}
}
/**
* 04.隐式内连接 投影 查询 查询部门编号为2的所有员工的姓名和薪水
* e.dept.deptNo 通过这个属性 进行关联连接
*/
@Test
public void test04(){
String hql="select empName,salary from Emp e where e.dept.deptNo=:dNo ";
List<Object[]> list = session.createQuery(hql).setParameter("dNo", 2).list();
for (Object[] objects : list) {
System.out.print(objects[0]+"\t"); //姓名
System.out.println(objects[1]); //薪水
}
}
/**
* 05.使用左外连接 查询员工和部门的信息
* 以左表为准,右表中没有对应的数据,返回null!
*/
@Test
public void test05(){
String hql="from Emp e left join e.dept";
List <Object[]>list = session.createQuery(hql).list();
for (Object[] objects : list) {
System.out.print(objects[0]+"\t"); //Emp对象
System.out.println(objects[1]); //Dept对象
}
}
/**
* 06.使用迫切左外连接 查询员工和部门的信息
* 以左表为准,右表中没有对应的数据,对象的属性null!
* Emp类中的dept属性为null!
*/
@Test
public void test06(){
String hql="from Emp e left join fetch e.dept";
List <Emp>list = session.createQuery(hql).list();
for (Emp emp : list) {
System.out.println(emp); //Emp对象
}
}
/**
* 07.使用右外连接 查询员工和部门的信息
* 以右表为准,左表中没有对应的数据,返回null!
*/
@Test
public void test07(){
String hql="from Emp e right join e.dept";
List <Object[]>list = session.createQuery(hql).list();
for (Object[] objects : list) {
System.out.print(objects[0]+"\t"); //Emp对象
System.out.println(objects[1]); //Dept对象
System.out.println("***********************************");
}
}
/**
* 08.使用迫切右外连接 查询员工和部门的信息
* 对象就是null! 虽然可以写 迫切右外连接 但是没有实际的意义!
* @Test
public void test08(){
String hql="from Emp e right join fetch e.dept";
List <Emp>list = session.createQuery(hql).list();
for (Emp emp : list) {
System.out.println(emp.getEmpName()); //Emp对象 空指针异常
}
}
*/ }

hibernate09--连接查询的更多相关文章

  1. MySQL8:连接查询

    连接查询 连接是关系型数据库模型的主要特点. 连接查询是关系型数据库中最主要的查询,主要包括内连接.外连接等通过联结运算符可以实现多个表查询. 在关系型数据库管理系统中,表建立时各种数据之间的关系不必 ...

  2. SQL多表连接查询(详细实例)

    转载博客:joeleo博客(http://www.xker.com/page/e2012/0708/117368.html) 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:stud ...

  3. Mysql联合,连接查询

    一. 联合查询    UNION, INTERSECT, EXCEPT UNION运算符可以将两个或两个以上Select语句的查询结果集合合并成一个结果集合显示,即执行联合查询.UNION的语法格式为 ...

  4. Oracle学习笔记五 SQL命令(三):Group by、排序、连接查询、子查询、分页

    GROUP BY和HAVING子句 GROUP BY子句 用于将信息划分为更小的组每一组行返回针对该组的单个结果 --统计每个部门的人数: Select count(*) from emp group ...

  5. SQL多表连接查询

    SQL多表连接查询 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student  截图如下: 表2:course  截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际 ...

  6. mysql的查询、子查询及连接查询

    >>>>>>>>>> 一.mysql查询的五种子句         where(条件查询).having(筛选).group by(分组). ...

  7. oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图

        多表连接查询 内连接(inner join) 目的:将多张表中能通过链接谓词或者链接运算符连接起来的数据查询出来. 等值连接(join...on(...=...)) --选出雇员的名字和雇员所 ...

  8. Sql Server系列:多表连接查询

    连接查询是关系数据中最主要的查询,包括内连接.外连接等.通过连接运算符可以实现多个表查询.内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值.SQL Server中的内连接有 ...

  9. SubSonic3.0使用外连接查询时查询不出数据的问题修改

    今天在开发时,要使用到外连接查询,如图 老是查不出数据,所以就追踪了一下代码,发现查询后生成的SQL语句变成了内连接了,真是晕 然后继续Debug,发现原来SqlQuery类在调用LeftInnerJ ...

  10. Access数据库多表连接查询

    第一次在Access中写多表查询,就按照MS数据库中的写法,结果报语法错,原来Access的多表连接查询是不一样的 表A.B.C,A关联B,B关联C,均用ID键关联 一般写法:select * fro ...

随机推荐

  1. 如何禁用package-lock

    因为 package-lock.json是自动生成的,可以配置 npm 来避免经常需要手动删除这个文件. 在当前项目禁用 package-lock.json 控制台下输入 echo 'package- ...

  2. Java代码质量监控工具Sonar安装

    1.  代码质量七宗罪 Sonar是一个代码质量管理系统.它的帮助文档开篇明义,提出了代码质量的七宗罪.总结的比較到位.最好还是一看: 1.        Bug和隐藏Bug(Bugs and Pot ...

  3. centos7 安装curl-7.51.0

    curl简介curl是一个广泛使用的用来上传和下载的命令行工具,当然严格来讲,它还可以有别的用途.对于测试来讲,它是Web相关测试非常实用的工具,包括debugging,使用起来非常方便.而且另一方面 ...

  4. springBoot于tomcat7搭建websocket服务

    最近在项目中需要服务端进行推送服务,于是决定使用webSocket进行双向通讯.刚开始觉得应该没问题,参考网上的博客进行开发配置.我们的开发环境使用的是springBoot.tomcat7.servl ...

  5. 单片机成长之路(51基础篇) - 006 在Linux下搭建51单片机的开发烧写环境

    在Linux下没有像keli那样好用的IDE来开发51单片机,开发环境只能自己搭建了. 第一步:安装交叉编译工具 a) 安装SDCC sudo apt-get install sdcc b)测试SDC ...

  6. 分析轮子(四)- 我也玩一把 Serializable.java

    前言:在写 分析轮子(一)-ArrayList.java 的时候曾经下过一个结论 “实现Serializable接口,表示ArrayList是可序列化的”,这个结论是以往学习的经验所得,并且平时在编程 ...

  7. H+ 添加(新增)Tab选项卡

    //注:在contabs.js文件中 $(function () { }); 方法外 加入//注: data-name="' + menuName + '" 这句是加入的自定义属性 ...

  8. [转]epoll详解

    什么是epollepoll是什么?按照man手册的说法:是为处理大批量句柄而作了改进的poll.当然,这不是2.6内核才有的,它是在2.5.44内核中被引进的(epoll(4) is a new AP ...

  9. ELK & ElasticSearch 5.1 基础概念及配置文件详解【转】

    转自:https://blog.csdn.net/zxf_668899/article/details/54582849 配置文件 基本概念 接近实时NRT 集群cluster 索引index 文档d ...

  10. 【GMT43智能液晶模块】例程十三:FATFS实验——文件操作

    实验原理: STM32F429上带有SDIO控制器,GMT43液晶模块上将SDIO连接到TF卡座.本实验 将Micro SD卡插入TF卡座上即可.通过FATFS创建test.txt文件,并且写入数据0 ...