假使现在有两张关联表customer和order一般情况下是一个customer可以对应多个order而一个order只能对应一个customer那么order中会有个customer对象作为属性hbm中会有个manytoone而customer中会有一个set<Order>hbm中会有一个onetomay
下面我们研究下在各种连接方式下的查询的策略及结果并对其归纳总结
第一无连接
hqlfrom Customer cwhere cname like T%
说明以上语句未显示指定其关联的order
执行的sqlselect * from customer wherename like T%
查询结果为
Id
Name
Age
Tom
Tom
结果结果中包含两个customer的对象元素他们分别对应id是和的两条数据他们的order集合属性均未被初始化
第二迫切左外连接
hqlfrom Customer c leftjoin fetch corder where cname like T%
说明显示指定查询某人对应的order属性
执行的sqlselect cC_ID cNAME oID oORDER_NUMBER oCUSTOMER_ID
From CUSTOMER c left out join ORDER o oncID=oCUSTOMER_ID where (cNAME like T%)
查询结果为
C_ID
NAME
AGE
O_ID
O_NUMBER
CUSToMER_ID
tom
Tom_order
tom
Tom_order
tom
Tom_order
tom
null
null
null
结果以左表为基础查询所有T开头的用户的对应的order当用户无订单时其order属性用null填充
(注hibernate允许一条查询迫切左外连接到多个多对一或者一对一的关联表比如A表中有一个字段bId一个字段cId而分别存在一个B表和C表两者的id分别是A的属性那么他们在进行迫切左外连接时语句为from A a left join fetch ab b left join fetch ac c where b is notnull and c is not null或者第二种情况为A中有bIdB中有cIdC表不与其他表关联那么他们的语句为from A a left join fetch ab b left join fetch bc where b is notnull and c is not null)
第三左外连接
hql: from Customer c left join corderwhere cname like T%
说明显示指定查询某人对应的order属性
执行的sqlselect cID C_ID cNAME cAGE oID O_ID oORDER_NUMBERoCUSTOMER_ID from CUSTOMER c left outer join ORDERS o on cID=oCUSTOMER_ID where (cNAME like T%)
查询结果为
C_ID
NAME
AGE
O_ID
ORDER_NUMER
CUSTOMER_ID
Tom
Tom_order
Tom
Tom_order
Tom
Tom_order
Tom
null
null
null
第四内连接
hql: from Customer c inner join corders owhere cname likeT%
执行的sql语句select cID C_ID cNAMEcAGE oID O_ID oORDER_NUMBERoCUSTOMER_IDfrom CUSTOMER c inner join ORDERS o on cID=oCUSTOMER_ID where (cNAME like T%)
查询结果为
C_ID
NAME
AGE
O_ID
ORDER_NUMBER
CUSTOMER_ID
Tom
Tom_order
Tom
Tom_order
Tom
Tom_order
第五迫切内链接
hqlfrom Customer cinner join fetch corders o where cname like T%
执行的sqlselect cID C_ID cNAMEcAGE oID O_ID oORDER_NUMBERoCUSTOMER_IDfrom CUSTOMER c inner join ORDERS o on cID=oCUSTOMER_ID where (cNAME like T%)
查询结果为
C_ID
NAME
AGE
O_ID
ORDER_NUMBER
CUSTOMER_ID
Tom
Tom_order
Tom
Tom_order
Tom
Tom_order
第六右外链接
Hqlfrom Customer c rightjoin fetch corders o where cname like T%
执行的sqlselect cID C_ID cNAMEcAGE oID O_ID oORDER_NUMBERoCUSTOMER_IDfrom CUSTOMER c right outer join ORDERS o on cID=oCUSTOMER_ID where (cNAME like T%)
查询结果为
C_ID
NAME
AGE
O_ID
ORDER_NUMBER
CUSTOMER_ID
Tom
Tom_order
Tom
Tom_order
Tom
Tom_order
总结则为下表所示
连接方式
对应的sql查询
Orders集合的检索策略
查询结果的内容
无连接
查询单个customer表
延迟检索策略
集合包含customer的元素集合中无重复元素customer对应的order对象没有被初始化
迫切左外连接
左外连接查询customer和order
迫切左外连接检索策略
集合中包含customer的元素集合中可能有重读元素customer对象的order集合属性被初始化
左外连接
左外连接查询customer和order
延迟检索策略
集合中包含对象数据类型的元素每个对象数组包含一对customer对象和order对象不同的对象数组可能重复引用同一个customer对象了customer对象的order集合属性未被初始化
内连接
内连接查询customer表和order表
延迟检索策略
集合中包含对象数据类型的元素每个对象数组包含一对customer对象和order对象不同的对象数组可能重复引用同一个customer对象了customer对象的order集合属性未被初始化
迫切内连接
内连接查询customer和order
迫切内链接检索策略
集合中包含customer类型的元素集合中可能有重复元素customer对象的order集合属性被初始化
右外链接
右外链接查询customer表和order
延迟检索策略
集合中包含对象数组类型的元素每个对象包含一对customer和order不同的对象数组可能引用同一个customer对象customer对象的order集合属性未被初始化