hibernate09--連接查詢
阿新 • • 發佈:2017-07-16
create ges ret nat before 賦值 測試數據 一個數 left join
創建實體類
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--連接查詢