内连接,迫切内连接,左外连接,迫切左外连接
来源:互联网 发布:校园招聘 云计算 编辑:程序博客网 时间:2024/06/05 07:51
内连接:
查询出来的每一项为 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_.deptidHibernate: 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]员工信息:[]
- Hibernate迫切左外连接和迫切内连接
- 内连接,迫切内连接,左外连接,迫切左外连接
- 迫切左外连接、 左外连接、 迫切内连接、 内连接
- 内连接,迫切内连接,左外连接,迫切左外连接
- 内连接,外连接,交叉连接,迫切左外连接和迫切内连接
- HQL (迫切)左外连接
- 关于内连接、左外连接和迫切左外连接
- Hibernate中的迫切左外连接和左外连接
- hibernate中关于迫切左外连接 左连接
- Hibernate查询-不迫切左连接与迫切的区别
- hibernate_day04_14_HQL多表查询(左外连接和迫切左外连接)
- 内连接 外连接 左连接
- 内连接,外连接,左连接,右连接,全连接
- 左连接、右连接、内连接、外连接、union连接
- 左连接、右连接、内连接、外连接、交叉连接
- 内连接,外连接,左连接,右连接,全连接,内连接,交叉连接,自连接
- 内连接,外连接,左连接,右连接,全连接,内连接,交叉连接,自连接
- Hibernate框架的内连接和迫切内连接
- 位图和位块传输(5)之画图程序
- hibernate 表关联 数据出错报的异常
- 怎样像iPhone模拟器中添加图片
- HDU 1020 Encoding 典型的字符串的压缩
- C++ const与指针关系
- 内连接,迫切内连接,左外连接,迫切左外连接
- ORA-12516, TNS: listener could not find available handler with matching protocol stack'
- SQL Server 模糊查询
- 堆和栈的区别
- 命令行安装配置db2
- 关于protected access label
- IOS中Info.plist文件中重要的键
- C++ 异常处理
- C++继承多态下的内存分布