hibernate09--连接查询
创建实体类
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--连接查询的更多相关文章
- MySQL8:连接查询
连接查询 连接是关系型数据库模型的主要特点. 连接查询是关系型数据库中最主要的查询,主要包括内连接.外连接等通过联结运算符可以实现多个表查询. 在关系型数据库管理系统中,表建立时各种数据之间的关系不必 ...
- SQL多表连接查询(详细实例)
转载博客:joeleo博客(http://www.xker.com/page/e2012/0708/117368.html) 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:stud ...
- Mysql联合,连接查询
一. 联合查询 UNION, INTERSECT, EXCEPT UNION运算符可以将两个或两个以上Select语句的查询结果集合合并成一个结果集合显示,即执行联合查询.UNION的语法格式为 ...
- Oracle学习笔记五 SQL命令(三):Group by、排序、连接查询、子查询、分页
GROUP BY和HAVING子句 GROUP BY子句 用于将信息划分为更小的组每一组行返回针对该组的单个结果 --统计每个部门的人数: Select count(*) from emp group ...
- SQL多表连接查询
SQL多表连接查询 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student 截图如下: 表2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际 ...
- mysql的查询、子查询及连接查询
>>>>>>>>>> 一.mysql查询的五种子句 where(条件查询).having(筛选).group by(分组). ...
- oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图
多表连接查询 内连接(inner join) 目的:将多张表中能通过链接谓词或者链接运算符连接起来的数据查询出来. 等值连接(join...on(...=...)) --选出雇员的名字和雇员所 ...
- Sql Server系列:多表连接查询
连接查询是关系数据中最主要的查询,包括内连接.外连接等.通过连接运算符可以实现多个表查询.内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值.SQL Server中的内连接有 ...
- SubSonic3.0使用外连接查询时查询不出数据的问题修改
今天在开发时,要使用到外连接查询,如图 老是查不出数据,所以就追踪了一下代码,发现查询后生成的SQL语句变成了内连接了,真是晕 然后继续Debug,发现原来SqlQuery类在调用LeftInnerJ ...
- Access数据库多表连接查询
第一次在Access中写多表查询,就按照MS数据库中的写法,结果报语法错,原来Access的多表连接查询是不一样的 表A.B.C,A关联B,B关联C,均用ID键关联 一般写法:select * fro ...
随机推荐
- 无法打开运行空间池,服务器管理器winrm插件可能已损坏或丢失
在使用windows2012 的服务器或云主机时,服务器安装不了iis服务. 提示 “无法打开运行空间池,服务器管理器winrm插件可能已损坏或丢失”. 这个问题可能的原因是您的机器未设置虚拟内存,可 ...
- ARCGIS做好的模型工具,已经设置为相对路径,拷贝后工具显示叉叉不可用的原因
.用户遇到此问题的场景: 用ModelBuilder构建了一系列的模型,其中有些模型很复杂,就把部分抽离出来,然后再整合到一起,我发现把整个模型工具箱拷贝到其他电脑上,这些复杂模型(里面除了系统自带的 ...
- 经纬度编码方法推荐-plus code简介
今天罗孚为大家推荐一种经纬度编码的方法--plus code,原名open location code,是Google于2014年发明的,旨在将表示地理位置的经纬度通过算法推导成一个字符串. plus ...
- 优麒麟 16.04 LTS(长期支持)版本
Ubuntu Kylin (中文又被称为优麒麟)是基于Ubuntu的一款官方衍生版. 它是一款专门为中国市场打造的免费操作系统.它包括Ubuntu用户期待的各种功能,并配有必备的中文软件及程序. ht ...
- <转>SQL Server CROSS APPLY and OUTER APPLY
Problem SQL Server 2005 introduced the APPLY operator, which is like a join clause and it allows joi ...
- R语言学习-set.seed()
今天查了一下R语言中set.seed(),该命令的作用是设定生成随机数的种子,种子是为了让结果具有重复性.如果不设定种子,生成的随机数无法重现. > x<-rnorm(10) #随机生成1 ...
- .NET 同步与异步 之 线程安全的集合 (十一)
本随笔续接:.NET 同步与异步 之 警惕闭包(十) 无论之前说的锁.原子操作 还是 警惕闭包,都是为安全保驾护航,本篇随笔继续安全方面的主题:线程安全的集合. 先看一下命名空间:System.Col ...
- 安装Docker,Asp.net core
升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署 Docker从入门到实践 一.安装Docker a).设置Docker仓库 1.按惯例,首先更新Ubuntu的包索引 ...
- 14.翻译系列:从已经存在的数据库中生成上下文类和实体类【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/code-first-from-existing-database.aspx EF 6 ...
- SATA主机协议的FPGA实现之准备工作
SATA主机协议的FPGA实现之准备工作 从2月中旬准备开始,经过3个月的奋战,我的又一个项目--基于FPGA的固态硬盘读写控制电路,已经基本实现.由于实用资料的匮乏,以及项目本身颇具挑战性,这个 ...