hibernate连接查询总结
2013-06-09 11:18
459 查看
假使现在有两张关联表,customer和order,一般情况下是一个customer可以对应多个order,而一个order只能对应一个customer;那么order中会有个customer对象作为属性,hbm中会有个many-to-one;而customer中,会有一个set<Order>,hbm中会有一个one-to-may.
下面我们研究下在各种连接方式下的查询的策略及结果,并对其归纳总结,
说明:以上语句未显示指定其关联的order、
执行的sql:select * from customer wherename like “T%”
查询结果为:
结果:结果中包含两个customer的对象元素,他们分别对应id是1和5的两条数据,他们的order集合属性均未被初始化。
说明:显示指定查询某人对应的order属性
执行的sql:select c.C_ID, c.NAME , o.ID , o.ORDER_NUMBER, o.CUSTOMER_ID
From CUSTOMER c left out join ORDER o onc.ID=o.CUSTOMER_ID where (c.NAME like “T%”)
查询结果为:
结果:以左表为基础,查询所有T开头的用户的对应的order。当用户无订单时,其order属性用null填充。
(注:hibernate允许一条查询迫切左外连接到多个,多对一或者一对一的关联表;比如A表中有一个字段bId,一个字段cId;而分别存在一个B表和C表,两者的id分别是A的属性。那么他们在进行迫切左外连接时,语句为:from A a left join fetch a.b b left join fetch a.c c where b is notnull and c is not null。或者第二种情况为A中有bId,B中有cId,C表不与其他表关联,那么他们的语句为:from A a left join
fetch a.b b left join fetch b.c where b is notnull and c is not null)
说明:显示指定查询某人对应的order属性
执行的sql:select c.ID C_ID, c.NAME , c.AGE, o.ID O_ID , o.ORDER_NUMBER,o.CUSTOMER_ID from CUSTOMER c left outer join ORDERS o on c.ID=o.CUSTOMER_ID where (c.NAME like ‘T%’)
查询结果为:
执行的sql语句:select c.ID C_ID ,c.NAME,c.AGE , o.ID O_ID , o.ORDER_NUMBER,o.CUSTOMER_IDfrom CUSTOMER c inner join ORDERS o on c.ID=o.CUSTOMER_ID where (c.NAME like ‘T%’)
查询结果为:
执行的sql:select c.ID C_ID ,c.NAME,c.AGE , o.ID O_ID , o.ORDER_NUMBER,o.CUSTOMER_IDfrom CUSTOMER c inner join ORDERS o on c.ID=o.CUSTOMER_ID where (c.NAME like ‘T%’)
查询结果为:
Hql:from Customer c rightjoin fetch c.orders o where c.name like ‘T%’
执行的sql:select c.ID C_ID ,c.NAME,c.AGE , o.ID O_ID , o.ORDER_NUMBER,o.CUSTOMER_IDfrom CUSTOMER c right outer join ORDERS o on c.ID=o.CUSTOMER_ID where (c.NAME like ‘T%’)
查询结果为:
总结则为下表所示:
下面我们研究下在各种连接方式下的查询的策略及结果,并对其归纳总结,
第一,无连接
hql:from Customer cwhere c.name like “T%”说明:以上语句未显示指定其关联的order、
执行的sql:select * from customer wherename like “T%”
查询结果为:
Id | Name | Age |
1 | Tom | 21 |
5 | Tom | 25 |
第二,迫切左外连接
hql:from Customer c leftjoin fetch c.order where c.name like “T%”说明:显示指定查询某人对应的order属性
执行的sql:select c.C_ID, c.NAME , o.ID , o.ORDER_NUMBER, o.CUSTOMER_ID
From CUSTOMER c left out join ORDER o onc.ID=o.CUSTOMER_ID where (c.NAME like “T%”)
查询结果为:
C_ID | NAME | AGE | O_ID | O_NUMBER | CUSToMER_ID |
1 | tom | 21 | 1 | Tom_order001 | 1 |
1 | tom | 21 | 2 | Tom_order002 | 1 |
1 | tom | 21 | 3 | Tom_order003 | 1 |
5 | tom | 25 | null | null | null |
(注:hibernate允许一条查询迫切左外连接到多个,多对一或者一对一的关联表;比如A表中有一个字段bId,一个字段cId;而分别存在一个B表和C表,两者的id分别是A的属性。那么他们在进行迫切左外连接时,语句为:from A a left join fetch a.b b left join fetch a.c c where b is notnull and c is not null。或者第二种情况为A中有bId,B中有cId,C表不与其他表关联,那么他们的语句为:from A a left join
fetch a.b b left join fetch b.c where b is notnull and c is not null)
第三,左外连接
hql: from Customer c left join c.orderwhere c.name like “T%”说明:显示指定查询某人对应的order属性
执行的sql:select c.ID C_ID, c.NAME , c.AGE, o.ID O_ID , o.ORDER_NUMBER,o.CUSTOMER_ID from CUSTOMER c left outer join ORDERS o on c.ID=o.CUSTOMER_ID where (c.NAME like ‘T%’)
查询结果为:
C_ID | NAME | AGE | O_ID | ORDER_NUMER | CUSTOMER_ID |
1 | Tom | 21 | 1 | Tom_order001 | 1 |
1 | Tom | 21 | 2 | Tom_order002 | 1 |
1 | Tom | 21 | 3 | Tom_order003 | 1 |
5 | Tom | 25 | null | null | null |
第四,内连接
hql: from Customer c inner join c.orders owhere c.name like”T%”执行的sql语句:select c.ID C_ID ,c.NAME,c.AGE , o.ID O_ID , o.ORDER_NUMBER,o.CUSTOMER_IDfrom CUSTOMER c inner join ORDERS o on c.ID=o.CUSTOMER_ID where (c.NAME like ‘T%’)
查询结果为:
C_ID | NAME | AGE | O_ID | ORDER_NUMBER | CUSTOMER_ID |
1 | Tom | 21 | 1 | Tom_order001 | 1 |
1 | Tom | 21 | 2 | Tom_order002 | 1 |
1 | Tom | 21 | 3 | Tom_order003 | 1 |
第五,迫切内链接
hql:from Customer cinner join fetch c.orders o where c.name like ‘T%’执行的sql:select c.ID C_ID ,c.NAME,c.AGE , o.ID O_ID , o.ORDER_NUMBER,o.CUSTOMER_IDfrom CUSTOMER c inner join ORDERS o on c.ID=o.CUSTOMER_ID where (c.NAME like ‘T%’)
查询结果为:
C_ID | NAME | AGE | O_ID | ORDER_NUMBER | CUSTOMER_ID |
1 | Tom | 21 | 1 | Tom_order001 | 1 |
1 | Tom | 21 | 2 | Tom_order002 | 1 |
1 | Tom | 21 | 3 | Tom_order003 | 1 |
第六,右外链接
Hql:from Customer c rightjoin fetch c.orders o where c.name like ‘T%’
执行的sql:select c.ID C_ID ,c.NAME,c.AGE , o.ID O_ID , o.ORDER_NUMBER,o.CUSTOMER_IDfrom CUSTOMER c right outer join ORDERS o on c.ID=o.CUSTOMER_ID where (c.NAME like ‘T%’)
查询结果为:
C_ID | NAME | AGE | O_ID | ORDER_NUMBER | CUSTOMER_ID |
1 | Tom | 21 | 1 | Tom_order001 | 1 |
1 | Tom | 21 | 2 | Tom_order002 | 1 |
1 | Tom | 21 | 3 | Tom_order003 | 1 |
总结则为下表所示:
连接方式 | 对应的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集合属性未被初始化。 |
相关文章推荐
- hibernate连接查询总结
- hibernate连接查询总结
- hibernate 实现多表连接查询
- Mysql_知识总结03(级联操作+多表查询【左外连接查询*重点掌握】+数据库的存储过程)
- Hibernate笔记:HQL查询总结(二)——条件查询(转)
- Hibernate高级查询方法(内含hibernate迫切左外连接检索策略)
- Mysql学习总结(24)——MySQL多表查询合并结果和内连接查询
- hibernate 实现多表连接查询 查询结果映射到自定义类中
- Hibernate的Criteria查询总结
- 学习struts2建bbs总结六:hibernate分页查询的问题--分页后程序定时无响应
- Mysql学习总结(25)——MySQL外连接查询
- hibernate系列十五:hql连接查询,查询性能优化,hql批量增删改
- Hibernate的连接查询
- hibernate查询语句总结
- hibernate 查询语句总结
- hibernate select 查询方式总结
- 022——hibernate连接查询
- hibernate关于hql的左外连接查询
- hibernate left join 多表连接查询不到结果,但生成的查询语句在数据库可以查询
- Hibernate 查询返回值总结