我们可以看到采用左外连接查询返回的结果集中包含的是对象数组,对象数组中的每个元素存放了一对相互关联的Customer对象和Order对象,而迫切左外连接会返回Customer对象,与Customer对象相关联的Order对象存放在Customer对象的集合元素对象中,这就是迫切左外连接和左外连接查询的其中一个区别(这两种检索生成的SQL语句是一样的),另一个区别是当使用左外连接时,对关联对象的检索会依照实体映射配置文件所指定的策略,而不会像迫切左外连接那样忽略它,比如此时对Customer对象关联的Order对象采用延迟加载,那么左外连接检索也会使用延迟加载机制检索Order对象。2、内连接,迫切内连接以及隐式内连接:若采用迫切内连接通过一下代码可以实现:Queryquerysessio
createQuery“fromCustomerci
erjoi
fetchcordersowherec
amelike‘zhao’”Listlistquerylistfori
ti0ilistsizeiCustomercustomerCustomerlistgeti这段代码将会采用迫切内连接检索,对集合元素的检索策略以及返回结果集中的对象类型都采用与迫切左外连接一样的方式,我这里就不再赘述,另外QBC查询不支持迫切内连接检索。如果去掉fetch就是内连接检索,如下面代码:Queryquerysessio
createQuery“fromCustomerci
erjoi
cordersowherec
amelike‘zhao’”Listlistquerylistfori
ti0ilistsizeiObjectobjsObjectlistgetiCustomercustomerCustomerobjs0orderorderOrderobjs1内连接检索,对集合元素的检索策略以及返回结果集中的对象类型都采用与左外连接一样的方式,QBC查询也同样支持内连接检索,如下代码:Listlistsessio
createCriteriaCustomerclassaddExpressio
like“
ame””zhao”MatchModeSTARTcreateCriteria“orders”addExpressio
like“order
umber””T”MatchModeSTARTlist上面代码等价于如下的HQL语句:SelectcfromCustomercjoi
cordersowherec
amelike‘zhao’a
doorder
ummberlike‘T’因此可以采用下面的方式访问结果集:fori
ti0ilistsizeiCustomercustomerCustomerlistgeti
f由此可见,采用内连接查询时HQL与QBC查询有不同的默认行为,HQL会检索出成对的Customer和Order对象,而QBC仅会检索出Customer对象。如果QBC查询想检索出成对的Customer和Order对象,可以采用如下代码:Listlistsessio
createCriteriaCustomerclasscreateAlias“orders””o”addExpressio
like“this
ame””zhao”MatchModeSTARTaddExpressio
like“order
umber””T”MatchModeSTARTretur
Maplistfori
ti0ilistsizeiMapmapMaplistgetiCustomercustomerCustomermapget“this”r