和SQL查詢同樣,HQL也支持各類各樣的鏈接查詢,如內鏈接、外鏈接鏈接類型 HQL語法內鏈接 inner join 或者join迫切內鏈接 inner join fetch 或join fetch左外鏈接 left outer join 或者 left join迫切左外鏈接 left outer join fetch 或者 left join fetch右外鏈接 right outer join 或者 right join package Test; import static org.junit.Assert.*; import java.util.List; import org.hibernate.Session; import org.junit.Test; import entity.Dept; import entity.Emp; import util.HibernateSessionFactory; public class HqlTest { /** * 使用內鏈接查詢部門和員工的信息。inner join,查出的是2個實體對象的列表,因此是object[]對象數組 */ @Test public void test1() { Session session=HibernateSessionFactory.getSession(); try { List<Object[]> list = session.createQuery("from Dept d join d.emps").list(); for (Object[] objects : list) { Dept dept=(Dept) objects[0]; Emp emp = (Emp) objects[1]; System.out.println(emp.getEname()+"\t"+dept.getDname()); System.out.println("查詢成功!"); } } catch (Exception e) { e.printStackTrace(); System.out.println("查詢失敗!"); }finally{ session.close(); } } /*使用隱式內鏈接按部門條件查詢員工信息,查詢的是Emp對象,因此返回是Emp類型的集合*/ @Test public void test2() { Session session=HibernateSessionFactory.getSession(); try { List<Emp> list = session.createQuery("from Emp e where e.dept.dname='SALES'").list(); for (Emp emp : list) { System.out.println(emp.getEname()+"\t"+emp.getDept().getDname()); } } catch (Exception e) { e.printStackTrace(); System.out.println("查詢成功!"); }finally{ session.close(); } } /** * select子句中使用隱式內鏈接按部門條件查詢員工信息。 */ @Test public void test3() { Session session=HibernateSessionFactory.getSession(); try { List<Object[]> list = session.createQuery("select e.dept.dname,e.ename from Emp e where e.dept.dname='SALES'").list(); for (Object[] objects : list) { System.out.println(objects[0]+"~~~~"+objects[1]); } System.out.println("查詢成功!"); } catch (Exception e) { e.printStackTrace(); }finally{ session.close(); } } /** * 使用迫切內鏈接查詢部門和員工的信息。 */ @Test public void test4() { Session session=HibernateSessionFactory.getSession(); try { List<Dept> list = session.createQuery("select distinct d from Dept d inner join fetch d.emps").list(); for (Dept dept : list) { System.out.println(dept.getDname()+"\t"+dept.getEmps()); } System.out.println("查詢成功!"); } catch (Exception e) { e.printStackTrace(); }finally{ session.close(); } } /** * 使用迫切左外鏈接查詢部門和員工的信息。 */ @Test public void test5() { Session session=HibernateSessionFactory.getSession(); try { List<Dept> list = session.createQuery("select distinct d from Dept d left join fetch d.emps").list(); for (Dept dept : list) { System.out.println(dept.getDname()+"\t"+dept.getEmps()); } System.out.println("查詢成功!"); } catch (Exception e) { e.printStackTrace(); }finally{ session.close(); } } /** * 使用交叉鏈接查詢部門和員工的信息。 */ @Test public void test6() { Session session=HibernateSessionFactory.getSession(); try { List<Object[]> list = session.createQuery("from Dept d,Emp e where d.deptno=e.dept.deptno").list(); for (Object[] objects : list) { Dept dept=(Dept) objects[0]; Emp emp=(Emp) objects[1]; System.out.println(emp.getEname()+"\t"+dept.getDname()); } System.out.println("查詢成功!"); } catch (Exception e) { e.printStackTrace(); }finally{ session.close(); } } }