和SQL查詢一樣,HQL也支持各種各樣的連接查詢, 如內連接、外連接。
實例:
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(); } } }