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

本文详细介绍了Hibernate中的内连接与左外连接查询方式,并通过实例演示了不同lazy设置的影响,包括如何使用迫切内连接和迫切左外连接来优化查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        内连接:

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


    Session session = DBUtil.getSession();
        String hql = "from Deptment d inner join d.employees";
        Query query = session.createQuery(hql);
        //如果设置lazy=”false",这时候就会关联部门和员工,除了发送内连接语句外,还发送了查询每个
        //部门下有哪些员工的sql语句
        List list = query.list();
        Iterator iter = list.iterator();
        while(iter.hasNext())
        {
     	   Object[] object = (Object[]) iter.next();
     	   System.out.println("部门信息:");
     	   System.out.println(object[0]);
     	   
     	   Deptment dept = (Deptment)object[0];
     	   //如果设置lazy="true"的时候,这时候才去查询部门的员工,发sql语句
     	   System.out.println(dept.getEmployees());
     	   System.out.println("员工信息:");
     	   System.out.println(object[1]);
        }
        session.close();

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

   

Hibernate: 
    select
        deptment0_.deptid as deptid0_0_,
        employees1_.epno as epno1_1_,
        deptment0_.deptname as deptname0_0_,
        employees1_.deptid as deptid1_1_,
        employees1_.epname as epname1_1_ 
    from
        deptment deptment0_ 
    inner join
        employee employees1_ 
            on deptment0_.deptid=employees1_.deptid
部门信息:
Deptment [deptid=1, deptname=aaa]
Hibernate: 
    select
        employees0_.deptid as deptid1_,
        employees0_.epno as epno1_,
        employees0_.epno as epno1_0_,
        employees0_.deptid as deptid1_0_,
        employees0_.epname as epname1_0_ 
    from
        employee employees0_ 
    where
        employees0_.deptid=?
[Employee [epno=2, deptment=Deptment [deptid=1, deptname=aaa], epname=shizhan2], Employee [epno=1, deptment=Deptment [deptid=1, deptname=aaa], epname=null]]
员工信息:
Employee [epno=1, deptment=Deptment [deptid=1, deptname=aaa], epname=null]
部门信息:
Deptment [deptid=1, deptname=aaa]
[Employee [epno=2, deptment=Deptment [deptid=1, deptname=aaa], epname=shizhan2], Employee [epno=1, deptment=Deptment [deptid=1, deptname=aaa], epname=null]]
员工信息:
Employee [epno=2, deptment=Deptment [deptid=1, deptname=aaa], epname=shizhan2]
部门信息:
Deptment [deptid=3, deptname=sdsdzz]
Hibernate: 
    select
        employees0_.deptid as deptid1_,
        employees0_.epno as epno1_,
        employees0_.epno as epno1_0_,
        employees0_.deptid as deptid1_0_,
        employees0_.epname as epname1_0_ 
    from
        employee employees0_ 
    where
        employees0_.deptid=?
[Employee [epno=3, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=xsxs], Employee [epno=4, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=ttt]]
员工信息:
Employee [epno=3, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=xsxs]
部门信息:
Deptment [deptid=3, deptname=sdsdzz]
[Employee [epno=3, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=xsxs], Employee [epno=4, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=ttt]]
员工信息:
Employee [epno=4, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=ttt]

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

  

Hibernate: 
    select
        deptment0_.deptid as deptid0_0_,
        employees1_.epno as epno1_1_,
        deptment0_.deptname as deptname0_0_,
        employees1_.deptid as deptid1_1_,
        employees1_.epname as epname1_1_ 
    from
        deptment deptment0_ 
    inner join
        employee employees1_ 
            on deptment0_.deptid=employees1_.deptid
Hibernate: 
    select
        employees0_.deptid as deptid1_,
        employees0_.epno as epno1_,
        employees0_.epno as epno1_0_,
        employees0_.deptid as deptid1_0_,
        employees0_.epname as epname1_0_ 
    from
        employee employees0_ 
    where
        employees0_.deptid=?
Hibernate: 
    select
        employees0_.deptid as deptid1_,
        employees0_.epno as epno1_,
        employees0_.epno as epno1_0_,
        employees0_.deptid as deptid1_0_,
        employees0_.epname as epname1_0_ 
    from
        employee employees0_ 
    where
        employees0_.deptid=?
部门信息:
Deptment [deptid=1, deptname=aaa]
[Employee [epno=2, deptment=Deptment [deptid=1, deptname=aaa], epname=shizhan2], Employee [epno=1, deptment=Deptment [deptid=1, deptname=aaa], epname=null]]
员工信息:
Employee [epno=1, deptment=Deptment [deptid=1, deptname=aaa], epname=null]
部门信息:
Deptment [deptid=1, deptname=aaa]
[Employee [epno=2, deptment=Deptment [deptid=1, deptname=aaa], epname=shizhan2], Employee [epno=1, deptment=Deptment [deptid=1, deptname=aaa], epname=null]]
员工信息:
Employee [epno=2, deptment=Deptment [deptid=1, deptname=aaa], epname=shizhan2]
部门信息:
Deptment [deptid=3, deptname=sdsdzz]
[Employee [epno=3, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=xsxs], Employee [epno=4, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=ttt]]
员工信息:
Employee [epno=3, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=xsxs]
部门信息:
Deptment [deptid=3, deptname=sdsdzz]
[Employee [epno=3, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=xsxs], Employee [epno=4, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=ttt]]
员工信息:
Employee [epno=4, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=ttt]

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

   

	 Session session = DBUtil.getSession();
         String hql = "from Deptment d inner join fetch d.employees";
         Query query = session.createQuery(hql);
         List list = query.list();
         Iterator iter = list.iterator();
         while(iter.hasNext())
         {
      	   Deptment object = (Deptment) iter.next();
      	   System.out.println("部门信息:");
      	   System.out.println(object);
      	   System.out.println("员工信息:");
      	   System.out.println(object.getEmployees());
         }

   结果:

   

Hibernate: 
    select
        deptment0_.deptid as deptid0_0_,
        employees1_.epno as epno1_1_,
        deptment0_.deptname as deptname0_0_,
        employees1_.deptid as deptid1_1_,
        employees1_.epname as epname1_1_,
        employees1_.deptid as deptid0__,
        employees1_.epno as epno0__ 
    from
        deptment deptment0_ 
    inner join
        employee employees1_ 
            on deptment0_.deptid=employees1_.deptid
部门信息:
Deptment [deptid=1, deptname=aaa]
员工信息:
[Employee [epno=2, deptment=Deptment [deptid=1, deptname=aaa], epname=shizhan2], Employee [epno=1, deptment=Deptment [deptid=1, deptname=aaa], epname=null]]
部门信息:
Deptment [deptid=1, deptname=aaa]
员工信息:
[Employee [epno=2, deptment=Deptment [deptid=1, deptname=aaa], epname=shizhan2], Employee [epno=1, deptment=Deptment [deptid=1, deptname=aaa], epname=null]]
部门信息:
Deptment [deptid=3, deptname=sdsdzz]
员工信息:
[Employee [epno=3, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=xsxs], Employee [epno=4, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=ttt]]
部门信息:
Deptment [deptid=3, deptname=sdsdzz]
员工信息:
[Employee [epno=3, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=xsxs], Employee [epno=4, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=ttt]]


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

   代码:

   

   Session session = DBUtil.getSession();
        String hql = "from Deptment d left join d.employees";
        Query query = session.createQuery(hql);
        List list = query.list();
        Iterator iter = list.iterator();
        while(iter.hasNext())
        {
     	   Object[] object = (Object[]) iter.next();
     	   System.out.println("部门信息:");
     	   System.out.println(object[0]);
     	   System.out.println("员工信息:");
     	   if(object[1]!=null){
     	      System.out.println(object[1]);
     	   }else{
     		  System.out.println("null");
     	   }
        }
        session.close();

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

   

Hibernate: 
    select
        deptment0_.deptid as deptid0_0_,
        employees1_.epno as epno1_1_,
        deptment0_.deptname as deptname0_0_,
        employees1_.deptid as deptid1_1_,
        employees1_.epname as epname1_1_ 
    from
        deptment deptment0_ 
    left outer join
        employee employees1_ 
            on deptment0_.deptid=employees1_.deptid
部门信息:
Deptment [deptid=1, deptname=aaa]
员工信息:
Employee [epno=1, deptment=Deptment [deptid=1, deptname=aaa], epname=null]
部门信息:
Deptment [deptid=1, deptname=aaa]
员工信息:
Employee [epno=2, deptment=Deptment [deptid=1, deptname=aaa], epname=shizhan2]
部门信息:
Deptment [deptid=3, deptname=sdsdzz]
员工信息:
Employee [epno=3, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=xsxs]
部门信息:
Deptment [deptid=3, deptname=sdsdzz]
员工信息:
Employee [epno=4, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=ttt]
部门信息:
Deptment [deptid=2, deptname=aaa]
员工信息:
null

  迫切左外连接:

  

  	   Session session = DBUtil.getSession();
       String hql = "from Deptment d left join fetch d.employees";
       Query query = session.createQuery(hql);
       List list = query.list();
       Iterator iter = list.iterator();
       while(iter.hasNext())
       {
  	     Deptment object = (Deptment) iter.next();
  	     System.out.println("部门信息:");
  	     System.out.println(object);
  	     System.out.println("员工信息:");
  	     System.out.println(object.getEmployees());
       }

   结果:

  

Hibernate: 
    select
        deptment0_.deptid as deptid0_0_,
        employees1_.epno as epno1_1_,
        deptment0_.deptname as deptname0_0_,
        employees1_.deptid as deptid1_1_,
        employees1_.epname as epname1_1_,
        employees1_.deptid as deptid0__,
        employees1_.epno as epno0__ 
    from
        deptment deptment0_ 
    left outer join
        employee employees1_ 
            on deptment0_.deptid=employees1_.deptid
部门信息:
Deptment [deptid=1, deptname=aaa]
员工信息:
[Employee [epno=2, deptment=Deptment [deptid=1, deptname=aaa], epname=shizhan2], Employee [epno=1, deptment=Deptment [deptid=1, deptname=aaa], epname=null]]
部门信息:
Deptment [deptid=1, deptname=aaa]
员工信息:
[Employee [epno=2, deptment=Deptment [deptid=1, deptname=aaa], epname=shizhan2], Employee [epno=1, deptment=Deptment [deptid=1, deptname=aaa], epname=null]]
部门信息:
Deptment [deptid=3, deptname=sdsdzz]
员工信息:
[Employee [epno=3, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=xsxs], Employee [epno=4, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=ttt]]
部门信息:
Deptment [deptid=3, deptname=sdsdzz]
员工信息:
[Employee [epno=3, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=xsxs], Employee [epno=4, deptment=Deptment [deptid=3, deptname=sdsdzz], epname=ttt]]
部门信息:
Deptment [deptid=2, deptname=aaa]
员工信息:
[]

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值