Hibernate的检索方式(三)
2010-06-12 13:44
274 查看
Hibernate的检索方式(三) - [Hibernate
]
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://aumy2008.blogbus.com/logs/13941318.html
三、连接查询
HQL
和
QBC
支持的各种连接类型
在程序中指定的链接查询类型 | HQL 语法 | QBC 语法 | 使用范围 |
内连接 | inner join 或者 join | Criteria.createAlias() | 适用于有关联的持久化类,并且在映射文件中对这种关联关系作了映射。 |
迫切内连接 | inner join fetch 或者 join fetch | 不支持 | |
隐式内连接 | 不支持 | ||
左外连接 | left outer join 或者 left join | 不支持 | |
迫切左外连接 | left outer join fetch 或者 left join fetch | FetchMode.EAGER | |
右外连接 | right outer join 或者 right join | 不支持 | |
交叉连接 | ClassA,ClassB | 不支持 | 适用于不存在关联关系的持久化类 |
、默认情况下关联级别的运行时检索策略
采用配置文件中设置的检索策略,但有一个例外
,那就是
HQL
会忽略映射文件设置的迫切左外连接策略,改用立即检索。
2
、迫切左外连接
显式指定
对象的关联关系为迫切左外连接检索策略,可以覆盖映射文件中指定的检索策略。
例
HQL
"from Customer c left join fetch c.orders o where c.name like 't%'"
+
" o.name like 't%'"
例
QBC
List reslut=session.createCriteria(Customer.
class
)
.setFetchMode(
"orders"
,FetchMode.EAGER)
.add(Expression.like(
"name"
,
"t"
,MatchMode.START))
.list();
当使用迫切左外连接检索策略时,查询结果中可能会包含重复元素,可以通过一个
HashSet
来过滤重复元素:
List result=….list();
HashSet set=new HashSet(result);
Hibernate
允许在一条查询语句中迫切左外连接多个多对一或一对一关联的类。
List reslut=session.createCriteria(A.
class
)
.setFetchMode(
"this.b"
,FetchMode.EAGER)
.setFetchMode(
"this.c"
,FetchMode.EAGER)
.add(Expression.isNotNull(
"this.b"
))
.add(Expression.isNotNull(
"this.c"
))
.list();
当存在传递关联时,可以通过
HQL
来同时迫切左外连接关联类和依赖关联类,但
QBC
无法表达这种形式的迫切左外连接。
3
、左外连接
使用左外连接查询时,将根据映射文件的配置来决定关联的检索策略。
4
、内连接
QBC
也支持内连接查询
List reslut=session.createCriteria(Customer.
class
)
.add(Expression.like(
"name"
,
"t"
,MatchMode.SRART))
.createCriteria(
"orders"
)
.add(Expression.like(
"orderNumber"
,
"t"
,MatchMode.SRART))
.list();
默认情况下,
QBC
只检索出
Customer
对象,以上代码等同于以下
HQL
查询语句:
"select c from Customer c join
c.orders o where c.name like 't%'"
+
" and o.orderNumber like 't%'"
;
createAlias()
方法为关联属性(集合)赋予别名。如果希望
QBC
返回的集合也包含成对的
Customer
和
Order
对象,可以调用
returnMaps()
方法:
List reslut=session.createCriteria(Customer.
class
)
.createAlias(
"orders"
,
"o"
)
.add(Expression.like(
"this.name"
,
"t"
,MatchMode.SRART))
.add(Expression.like(
"o.orderNumber"
,
"t"
,MatchMode.SRART))
.returnMaps()
.list();
采用内连接查询时,
HQL
与
QBC
有不同的默认行为,前者检索成对的对象,后者仅检索出要检索的单个对象(不包含关联的对象)。
5
、迫切内连接
显式指定
对象的关联关系为迫切内连接检索策略,可以覆盖映射文件中指定的检索策略。
6
、隐式内连接
一对一
"from Cunstomer c where c.homeAddress.provice like '%hai%'"
List reslut=session.createCriteria(Customer.
class
)
.add(Expression.like(
"homeAddress.provice"
,
"t"
,MatchMode.SRART))
.list();
多对一
"from Order o where o.customer.name like '%hai%'"
QBC
不支持隐式内连接,下边是不正确的,:
List reslut=session.createCriteria(Order.
class
)
.add(Expression.like(
"customer.name"
,
"t"
,MatchMode.SRART))
.list();
对于
QBC
,必须显式指定内连接查询:
List reslut=session.createCriteria(Order.
class
)
.createAlias(
"customer"
,
"c"
)
.add(Expression.like(
"c.name"
,
"t"
,MatchMode.SRART))
.list();
一对多或多对多
隐式内连接不适用。
7
、右外连接
8
、使用
SQL
风格的交叉连接和隐式内连接
HQL
支持
SQL
风格的交叉连接查询。如:
from Customer c, Order o
在
SQL
语言中,显式内连接查询的语句使用
inner join
关键字,并且用
on
字句设定连接条件,形式为:
"select * from CUSTOMER c inner join ORDER o on c.ID=o.CUSTOMER_ID"
隐式内连接查询语句不包含关键字阿,并且用
where
字句设定连接条件:
"select * from CUSTOMER c ,ORDER o where c.ID=o.CUSTOMER_ID"
9
、关联级别运行是的检索策略
(
1
)没有显式指定,使用配置文件的,但有一个例外
,那就是
HQL
会忽略映射文件设置的迫切左外连接策略,改用立即检索。
(
2
)如果显式指定,就会覆盖映射文件配置的检索策略。在
HQL
查询语句中显式指定检索策略包括以下内容。
l
left join fetch
l
inner join fetch
QBC
通过
FetchMode
类来显式指定检索策略,有以下
3
个静态实例。
l
FetchMode.DEFAULT
:默认,采用配置;
l
FetchMode.EAGER
:覆盖,指定迫切左外连接检索策略;
l
FetchMode.LAZY
:覆盖映射配置文件的检索策略,在程序中指定延迟检索策略。
待续!
相关文章推荐
- Hibernate的检索方式(2)hql
- Hibernate检索方式
- JAVAWEB开发之Hibernate详解(三)——Hibernate的检索方式、抓取策略以及利用二级缓存进行优化、解决数据库事务并发问题
- Hibernate —— HQL、QBC检索方式
- hibernate提供的5种检索数据方式
- Hibernate学习之路(十一):hibernate的检索方式(Oracle数据库)
- [原创]java WEB学习笔记90:Hibernate学习之路-- -HQL检索方式,分页查询,命名查询语句,投影查询,报表查询
- Hibernate检索方式
- Java程序员从笨鸟到菜鸟之(六十三)细谈Hibernate(十四)Hibernate三种检索方式详解
- Hibernate检索方式的学习2015-11-14
- Hibernate的检索方式
- Hibernate的QBC检索方式
- Hibernate的五种数据检索方式
- Hibernate基础学习(七)—检索方式
- Hibernate的检索方式详解(一)
- hibernate检索方式——get和load检索方式的区别
- 【知识整理】Hibernate的HQL检索方式使用入门
- Hibernate的其他几种检索方式:
- Hibernate 检索方式
- Hibernate的检索方式(三)