创建实体类

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. 招聘移动APP、接口、自动化、性能和安全方面的兼职测试讲师

    只要您在移动APP.接口.自动化.性能和安全方面有丰富的测试经验,我们都欢迎您能加入我们,成为我们的兼职测试讲师,我们可以提供给您一份优厚的薪资,同时能在行业发展.企业培训.授课经验.出版专业著作等方 ...

  2. xhprof 运行结果名词解释

    Overall Summary Inclusive Time (或子树时间):包括子函数所有执行时间. Exclusive Time/Self Time:函数执行本身花费的时间,不包括子树执行时间. ...

  3. 09、高级编程之基于排序机制的wordcount程序

    package sparkcore.java; import java.util.Arrays; import java.util.Iterator; import org.apache.spark. ...

  4. [Python设计模式] 第15章 如何兼容各种DB——抽象工厂模式

    github地址:https://github.com/cheesezh/python_design_patterns 题目 如何让一个程序,可以灵活替换数据库? 基础版本 class User(): ...

  5. Centos7.4别名设置提高工作效率

    一.打开 .bashrc文件 1.位置:~(cd ~)目录下 2.cat .bashrc 原文件内容如下: # .bashrc # User specific aliases and function ...

  6. 【解惑】领略Java内部类的“内部”

    转自:http://www.iteye.com/topic/494230 内部类有两种情况: (1) 在类中定义一个类(私有内部类,静态内部类) (2) 在方法中定义一个类(局部内部类,匿名内部类) ...

  7. idea checkout 项目

    1. 2.添加一个连接 选择远程目录checkout  , 然后选择本地目录   但是这样会创建一个新的projectwindow  如果要创建为module的话  1.手动引入从svn check的 ...

  8. [转]Kindeditor图片粘贴上传(chrome)

    原文地址:https://www.cnblogs.com/jsper/p/7608004.html 首先要赞一下kindeditor,一个十分强大的国产开源web-editor组件. kindedit ...

  9. 怎么让self.view的Y从navigationBar下面开始计算

    原文地址 http://blog.sina.com.cn/s/blog_1410870560102wu9a.html 在iOS 7中,苹果引入了一个新的属性,叫做[UIViewController s ...

  10. ubuntu Ros环境halcon的一个程序

    这个首先并不是我一边做实验一遍记录的,而是我做完成以后才想起来做个分享的,所以中途遇到的很多问题,并没有来得及记录下来,现在写的这些都是后话了 首先呢!我们不需要在ROS下写halcon的程序也是可以 ...