您的位置:首页 > 其它

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

不支持

适用于不存在关联关系的持久化类

1

、默认情况下关联级别的运行时检索策略



采用配置文件中设置的检索策略,但有一个例外
,那就是
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

:覆盖映射配置文件的检索策略,在程序中指定延迟检索策略。



待续!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: