java

位置:IT落伍者 >> java >> 浏览文章

hibernate连接查询总结


发布日期:2021年05月31日
 
hibernate连接查询总结

假使现在有两张关联表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集合属性未被初始化

上一篇:SPring管理Hibernate事务出现异常处理

下一篇:Eclipse RCP编辑器关闭的屏蔽方法