代码改变世界

hibernate-HQL连接查询 转载sincoolvip

2017-07-31 17:23  Bman_Castle  阅读(496)  评论(0)    收藏  举报
和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(); } } }