内连接,迫切内连接,左外连接,迫切左外连接



        内连接:

     查询出来的每一项为 object[]数组,左表存在object[0]中,右表存在object[1]中,object[0]和object[1]的关联关系有没有设置,取决于你的配置文件中,关联的配置时候lazy的值,如果lazy=false,则马上维护关系,lazy=true,先不维护关系,等用到关联关系维系的值时才查询。


[java]  view plain  copy
  1. Session session = DBUtil.getSession();  
  2.     String hql = "from Deptment d inner join d.employees";  
  3.     Query query = session.createQuery(hql);  
  4.     //如果设置lazy=”false",这时候就会关联部门和员工,除了发送内连接语句外,还发送了查询每个  
  5.     //部门下有哪些员工的sql语句  
  6.     List list = query.list();  
  7.     Iterator iter = list.iterator();  
  8.     while(iter.hasNext())  
  9.     {  
  10.        Object[] object = (Object[]) iter.next();  
  11.        System.out.println("部门信息:");  
  12.        System.out.println(object[0]);  
  13.          
  14.        Deptment dept = (Deptment)object[0];  
  15.        //如果设置lazy="true"的时候,这时候才去查询部门的员工,发sql语句  
  16.        System.out.println(dept.getEmployees());  
  17.        System.out.println("员工信息:");  
  18.        System.out.println(object[1]);  
  19.     }  
  20.     session.close();  

   结果1(设置关联关系的维护为lazy=true):

   

[java]  view plain  copy
  1. Hibernate:   
  2.     select  
  3.         deptment0_.deptid as deptid0_0_,  
  4.         employees1_.epno as epno1_1_,  
  5.         deptment0_.deptname as deptname0_0_,  
  6.         employees1_.deptid as deptid1_1_,  
  7.         employees1_.epname as epname1_1_   
  8.     from  
  9.         deptment deptment0_   
  10.     inner join  
  11.         employee employees1_   
  12.             on deptment0_.deptid=employees1_.deptid  
  13. 部门信息:  
  14. Deptment [deptid=1, deptname=aaa]  
  15. Hibernate:   
  16.     select  
  17.         employees0_.deptid as deptid1_,  
  18.         employees0_.epno as epno1_,  
  19.         employees0_.epno as epno1_0_,  
  20.         employees0_.deptid as deptid1_0_,  
  21.         employees0_.epname as epname1_0_   
  22.     from  
  23.         employee employees0_   
  24.     where  
  25.         employees0_.deptid=?  
  26. [Employee [epno=2, deptment=Deptment [deptid=1, deptname=aaa], epname=shizhan2], Employee [epno=1, deptment=Deptment [deptid=1, deptname=aaa], epname=null]]  
  27. 员工信息:  
  28. Employee [epno=1, deptment=Deptment [deptid=1, deptname=aaa], epname=null]  
  29. 部门信息:  
  30. Deptment [deptid=1, deptname=aaa]  
  31. [Employee [epno=2, deptment=Deptment [deptid=1, deptname=aaa], epname=shizhan2], Employee [epno=1, deptment=Deptment [deptid=1, deptname=aaa], epname=null]]  
  32. 员工信息:  
  33. Employee [epno=2, deptment=Deptment [deptid=1, deptname=aaa], epname=shizhan2]  
  34. 部门信息:  
  35. Deptment [deptid=3, deptname=sdsdzz]  
  36. Hibernate:   
  37.     select  
  38.         employees0_.deptid as deptid1_,  
  39.         employees0_.epno as epno1_,  
  40.         employees0_.epno as epno1_0_,  
  41.         employees0_.deptid as deptid1_0_,  
  42.         employees0_.epname as epname1_0_   
  43.     from  
  44.         employee employees0_   
  45.     where  
  46.         employees0_.deptid=?  
  47. [Employee [epno=3, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=xsxs], Employee [epno=4, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=ttt]]  
  48. 员工信息:  
  49. Employee [epno=3, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=xsxs]  
  50. 部门信息:  
  51. Deptment [deptid=3, deptname=sdsdzz]  
  52. [Employee [epno=3, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=xsxs], Employee [epno=4, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=ttt]]  
  53. 员工信息:  
  54. Employee [epno=4, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=ttt]  

  结果2(设置关联关系的维护lazy=false,关联关系立马维护,产生多条sql语句)

  

[java]  view plain  copy
  1. Hibernate:   
  2.     select  
  3.         deptment0_.deptid as deptid0_0_,  
  4.         employees1_.epno as epno1_1_,  
  5.         deptment0_.deptname as deptname0_0_,  
  6.         employees1_.deptid as deptid1_1_,  
  7.         employees1_.epname as epname1_1_   
  8.     from  
  9.         deptment deptment0_   
  10.     inner join  
  11.         employee employees1_   
  12.             on deptment0_.deptid=employees1_.deptid  
  13. Hibernate:   
  14.     select  
  15.         employees0_.deptid as deptid1_,  
  16.         employees0_.epno as epno1_,  
  17.         employees0_.epno as epno1_0_,  
  18.         employees0_.deptid as deptid1_0_,  
  19.         employees0_.epname as epname1_0_   
  20.     from  
  21.         employee employees0_   
  22.     where  
  23.         employees0_.deptid=?  
  24. Hibernate:   
  25.     select  
  26.         employees0_.deptid as deptid1_,  
  27.         employees0_.epno as epno1_,  
  28.         employees0_.epno as epno1_0_,  
  29.         employees0_.deptid as deptid1_0_,  
  30.         employees0_.epname as epname1_0_   
  31.     from  
  32.         employee employees0_   
  33.     where  
  34.         employees0_.deptid=?  
  35. 部门信息:  
  36. Deptment [deptid=1, deptname=aaa]  
  37. [Employee [epno=2, deptment=Deptment [deptid=1, deptname=aaa], epname=shizhan2], Employee [epno=1, deptment=Deptment [deptid=1, deptname=aaa], epname=null]]  
  38. 员工信息:  
  39. Employee [epno=1, deptment=Deptment [deptid=1, deptname=aaa], epname=null]  
  40. 部门信息:  
  41. Deptment [deptid=1, deptname=aaa]  
  42. [Employee [epno=2, deptment=Deptment [deptid=1, deptname=aaa], epname=shizhan2], Employee [epno=1, deptment=Deptment [deptid=1, deptname=aaa], epname=null]]  
  43. 员工信息:  
  44. Employee [epno=2, deptment=Deptment [deptid=1, deptname=aaa], epname=shizhan2]  
  45. 部门信息:  
  46. Deptment [deptid=3, deptname=sdsdzz]  
  47. [Employee [epno=3, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=xsxs], Employee [epno=4, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=ttt]]  
  48. 员工信息:  
  49. Employee [epno=3, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=xsxs]  
  50. 部门信息:  
  51. Deptment [deptid=3, deptname=sdsdzz]  
  52. [Employee [epno=3, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=xsxs], Employee [epno=4, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=ttt]]  
  53. 员工信息:  
  54. Employee [epno=4, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=ttt]  

   迫切内连接(不管设置lazy=true或者lazy=false,他关联关系立马就维护好了,且只发送一条sql语句,且结果集中的每条结果为 对象(本例中为部门对象,部门里面的员工已经填充好了)

   

[java]  view plain  copy
  1. Session session = DBUtil.getSession();  
  2.        String hql = "from Deptment d inner join fetch d.employees";  
  3.        Query query = session.createQuery(hql);  
  4.        List list = query.list();  
  5.        Iterator iter = list.iterator();  
  6.        while(iter.hasNext())  
  7.        {  
  8.            Deptment object = (Deptment) iter.next();  
  9.            System.out.println("部门信息:");  
  10.            System.out.println(object);  
  11.            System.out.println("员工信息:");  
  12.            System.out.println(object.getEmployees());  
  13.        }  

   结果:

   

[java]  view plain  copy
  1. Hibernate:   
  2.     select  
  3.         deptment0_.deptid as deptid0_0_,  
  4.         employees1_.epno as epno1_1_,  
  5.         deptment0_.deptname as deptname0_0_,  
  6.         employees1_.deptid as deptid1_1_,  
  7.         employees1_.epname as epname1_1_,  
  8.         employees1_.deptid as deptid0__,  
  9.         employees1_.epno as epno0__   
  10.     from  
  11.         deptment deptment0_   
  12.     inner join  
  13.         employee employees1_   
  14.             on deptment0_.deptid=employees1_.deptid  
  15. 部门信息:  
  16. Deptment [deptid=1, deptname=aaa]  
  17. 员工信息:  
  18. [Employee [epno=2, deptment=Deptment [deptid=1, deptname=aaa], epname=shizhan2], Employee [epno=1, deptment=Deptment [deptid=1, deptname=aaa], epname=null]]  
  19. 部门信息:  
  20. Deptment [deptid=1, deptname=aaa]  
  21. 员工信息:  
  22. [Employee [epno=2, deptment=Deptment [deptid=1, deptname=aaa], epname=shizhan2], Employee [epno=1, deptment=Deptment [deptid=1, deptname=aaa], epname=null]]  
  23. 部门信息:  
  24. Deptment [deptid=3, deptname=sdsdzz]  
  25. 员工信息:  
  26. [Employee [epno=3, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=xsxs], Employee [epno=4, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=ttt]]  
  27. 部门信息:  
  28. Deptment [deptid=3, deptname=sdsdzz]  
  29. 员工信息:  
  30. [Employee [epno=3, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=xsxs], Employee [epno=4, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=ttt]]  


   左外连接:在内连接的基础上,保证左表的数据不能丢失,如果左表中没有对应的右表数据,则右表对象置为空。lazy的设置导致的结果影响和内连接相同。

   代码:

   

[java]  view plain  copy
  1. Session session = DBUtil.getSession();  
  2.      String hql = "from Deptment d left join d.employees";  
  3.      Query query = session.createQuery(hql);  
  4.      List list = query.list();  
  5.      Iterator iter = list.iterator();  
  6.      while(iter.hasNext())  
  7.      {  
  8.        Object[] object = (Object[]) iter.next();  
  9.        System.out.println("部门信息:");  
  10.        System.out.println(object[0]);  
  11.        System.out.println("员工信息:");  
  12.        if(object[1]!=null){  
  13.           System.out.println(object[1]);  
  14.        }else{  
  15.           System.out.println("null");  
  16.        }  
  17.      }  
  18.      session.close();  

    结果(lazy=true 的时候),我们可以看到最后多了一个null:

   

[java]  view plain  copy
  1. Hibernate:   
  2.     select  
  3.         deptment0_.deptid as deptid0_0_,  
  4.         employees1_.epno as epno1_1_,  
  5.         deptment0_.deptname as deptname0_0_,  
  6.         employees1_.deptid as deptid1_1_,  
  7.         employees1_.epname as epname1_1_   
  8.     from  
  9.         deptment deptment0_   
  10.     left outer join  
  11.         employee employees1_   
  12.             on deptment0_.deptid=employees1_.deptid  
  13. 部门信息:  
  14. Deptment [deptid=1, deptname=aaa]  
  15. 员工信息:  
  16. Employee [epno=1, deptment=Deptment [deptid=1, deptname=aaa], epname=null]  
  17. 部门信息:  
  18. Deptment [deptid=1, deptname=aaa]  
  19. 员工信息:  
  20. Employee [epno=2, deptment=Deptment [deptid=1, deptname=aaa], epname=shizhan2]  
  21. 部门信息:  
  22. Deptment [deptid=3, deptname=sdsdzz]  
  23. 员工信息:  
  24. Employee [epno=3, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=xsxs]  
  25. 部门信息:  
  26. Deptment [deptid=3, deptname=sdsdzz]  
  27. 员工信息:  
  28. Employee [epno=4, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=ttt]  
  29. 部门信息:  
  30. Deptment [deptid=2, deptname=aaa]  
  31. 员工信息:  
  32. null  

  迫切左外连接:

  

[java]  view plain  copy
  1. Session session = DBUtil.getSession();  
  2.  String hql = "from Deptment d left join fetch d.employees";  
  3.  Query query = session.createQuery(hql);  
  4.  List list = query.list();  
  5.  Iterator iter = list.iterator();  
  6.  while(iter.hasNext())  
  7.  {  
  8.   Deptment object = (Deptment) iter.next();  
  9.   System.out.println("部门信息:");  
  10.   System.out.println(object);  
  11.   System.out.println("员工信息:");  
  12.   System.out.println(object.getEmployees());  
  13.  }  

   结果:

  

[java]  view plain  copy
  1. Hibernate:   
  2.     select  
  3.         deptment0_.deptid as deptid0_0_,  
  4.         employees1_.epno as epno1_1_,  
  5.         deptment0_.deptname as deptname0_0_,  
  6.         employees1_.deptid as deptid1_1_,  
  7.         employees1_.epname as epname1_1_,  
  8.         employees1_.deptid as deptid0__,  
  9.         employees1_.epno as epno0__   
  10.     from  
  11.         deptment deptment0_   
  12.     left outer join  
  13.         employee employees1_   
  14.             on deptment0_.deptid=employees1_.deptid  
  15. 部门信息:  
  16. Deptment [deptid=1, deptname=aaa]  
  17. 员工信息:  
  18. [Employee [epno=2, deptment=Deptment [deptid=1, deptname=aaa], epname=shizhan2], Employee [epno=1, deptment=Deptment [deptid=1, deptname=aaa], epname=null]]  
  19. 部门信息:  
  20. Deptment [deptid=1, deptname=aaa]  
  21. 员工信息:  
  22. [Employee [epno=2, deptment=Deptment [deptid=1, deptname=aaa], epname=shizhan2], Employee [epno=1, deptment=Deptment [deptid=1, deptname=aaa], epname=null]]  
  23. 部门信息:  
  24. Deptment [deptid=3, deptname=sdsdzz]  
  25. 员工信息:  
  26. [Employee [epno=3, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=xsxs], Employee [epno=4, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=ttt]]  
  27. 部门信息:  
  28. Deptment [deptid=3, deptname=sdsdzz]  
  29. 员工信息:  
  30. [Employee [epno=3, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=xsxs], Employee [epno=4, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=ttt]]  
  31. 部门信息:  
  32. Deptment [deptid=2, deptname=aaa]  
  33. 员工信息:  
  34. []  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值