HQL Hibernate查询语言Word下载.docx
- 文档编号:5761228
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:20
- 大小:24.93KB
HQL Hibernate查询语言Word下载.docx
《HQL Hibernate查询语言Word下载.docx》由会员分享,可在线阅读,更多相关《HQL Hibernate查询语言Word下载.docx(20页珍藏版)》请在冰点文库上搜索。
fromFormulaformfulljoinform.parameterparam
受支持的连接类型是从ANSISQL中借鉴来的。
innerjoin(内连接)
leftouterjoin(左外连接)
rightouterjoin(右外连接)
fulljoin(全连接,并不常用)
语句innerjoin,leftouterjoin以及rightouterjoin可以简写。
joincat.mateasmate
leftjoincat.kittensaskitten
还有,一个"
fetch"
连接允许仅仅使用一个选择语句就将相关联的对象或一组值的集合随着他们的父对象的初始化而被初始化,这种方法在使用到集合的情况下尤其有用,对于关联和集合来说,它有效的代替了映射文件中的外联接与延迟声明(lazydeclarations).查看第20.1节“抓取策略(Fetchingstrategies)”以获得等多的信息。
innerjoinfetchcat.mate
leftjoinfetchcat.kittens
一个fetch连接通常不需要被指定别名,因为相关联的对象不应当被用在where子句(或其它任何子句)中。
同时,相关联的对象并不在查询的结果中直接返回,但可以通过他们的父对象来访问到他们。
注意fetch构造变量在使用了scroll()或iterate()函数的查询中是不能使用的。
最后注意,使用fulljoinfetch与rightjoinfetch是没有意义的。
如果你使用属性级别的延迟获取(lazyfetching)(这是通过重新编写字节码实现的),可以使用fetchallproperties来强制Hibernate立即取得那些原本需要延迟加载的属性(在第一个查询中)。
fromDocumentfetchallpropertiesorderbyname
fromDocumentdocfetchallpropertieswherelower(doc.name)like'
%cats%'
15.4.select子句
select子句选择将哪些对象与属性返回到查询结果集中.考虑如下情况:
selectmate
该语句将选择matesofotherCats。
(其他猫的配偶)实际上,你可以更简洁的用以下的查询语句表达相同的含义:
selectcat.matefromCatcat
查询语句可以返回值为任何类型的属性,包括返回类型为某种组件(Component)的属性:
selectcat.namefromDomesticCatcat
wherecat.namelike'
fri%'
selectcust.name.firstNamefromCustomerascust
查询语句可以返回多个对象和(或)属性,存放在Object[]队列中,
selectmother,offspr,mate.name
fromDomesticCatasmother
innerjoinmother.mateasmate
leftouterjoinmother.kittensasoffspr
或存放在一个List对象中,
selectnewlist(mother,offspr,mate.name)
也可能直接返回一个实际的类型安全的Java对象,
selectnewFamily(mother,mate,offspr)
joinmother.mateasmate
leftjoinmother.kittensasoffspr
假设类Family有一个合适的构造函数.
你可以使用关键字as给“被选择了的表达式”指派别名:
selectmax(bodyWeight)asmax,min(bodyWeight)asmin,count(*)asn
这种做法在与子句selectnewmap一起使用时最有用:
selectnewmap(max(bodyWeight)asmax,min(bodyWeight)asmin,count(*)asn)
该查询返回了一个Map的对象,内容是别名与被选择的值组成的名-值映射。
15.5.聚集函数
HQL查询甚至可以返回作用于属性之上的聚集函数的计算结果:
selectavg(cat.weight),sum(cat.weight),max(cat.weight),count(cat)
受支持的聚集函数如下:
avg(...),sum(...),min(...),max(...)
count(*)
count(...),count(distinct...),count(all...)
你可以在选择子句中使用数学操作符、连接以及经过验证的SQL函数:
selectcat.weight+sum(kitten.weight)
fromCatcat
joincat.kittenskitten
groupbycat.id,cat.weight
selectfirstName||'
'
||initial||'
||upper(lastName)fromPerson
关键字distinct与all也可以使用,它们具有与SQL相同的语义.
selectdistinctcat.namefromCatcat
selectcount(distinctcat.name),count(cat)fromCatcat
15.6.多态查询
一个如下的查询语句:
不仅返回Cat类的实例,也同时返回子类DomesticCat的实例.Hibernate可以在from子句中指定任何Java类或接口.查询会返回继承了该类的所有持久化子类的实例或返回声明了该接口的所有持久化类的实例。
下面的查询语句返回所有的被持久化的对象:
fromjava.lang.Objecto
接口Named可能被各种各样的持久化类声明:
fromNamedn,Namedmwheren.name=m.name
注意,最后的两个查询将需要超过一个的SQLSELECT.这表明orderby子句没有对整个结果集进行正确的排序.(这也说明你不能对这样的查询使用Query.scroll()方法.)
15.7.where子句
where子句允许你将返回的实例列表的范围缩小.如果没有指定别名,你可以使用属性名来直接引用属性:
fromCatwherename='
Fritz'
如果指派了别名,需要使用完整的属性名:
fromCatascatwherecat.name='
返回名为(属性name等于)'
的Cat类的实例。
selectfoo
fromFoofoo,Barbar
wherefoo.startDate=bar.date
将返回所有满足下面条件的Foo类的实例:
存在如下的bar的一个实例,其date属性等于Foo的startDate属性。
复合路径表达式使得where子句非常的强大,考虑如下情况:
fromCatcatwherecat.mate.nameisnotnull
该查询将被翻译成为一个含有表连接(内连接)的SQL查询。
如果你打算写像这样的查询语句
fromFoofoo
wherefoo.bar.baz.customer.address.cityisnotnull
在SQL中,你为达此目的将需要进行一个四表连接的查询。
=运算符不仅可以被用来比较属性的值,也可以用来比较实例:
fromCatcat,Catrivalwherecat.mate=rival.mate
selectcat,mate
fromCatcat,Catmate
wherecat.mate=mate
特殊属性(小写)id可以用来表示一个对象的唯一的标识符。
(你也可以使用该对象的属性名。
)
fromCatascatwherecat.id=123
fromCatascatwherecat.mate.id=69
第二个查询是有效的。
此时不需要进行表连接!
同样也可以使用复合标识符。
比如Person类有一个复合标识符,它由country属性与medicareNumber属性组成。
frombank.Personperson
whereperson.id.country='
AU'
andperson.id.medicareNumber=123456
frombank.Accountaccount
whereaccount.owner.id.country='
andaccount.owner.id.medicareNumber=123456
第二个查询也不需要进行表连接。
同样的,特殊属性class在进行多态持久化的情况下被用来存取一个实例的鉴别值(discriminatorvalue)。
一个嵌入到where子句中的Java类的名字将被转换为该类的鉴别值。
fromCatcatwherecat.class=DomesticCat
你也可以声明一个属性的类型是组件或者复合用户类型(以及由组件构成的组件等等)。
永远不要尝试使用以组件类型来结尾的路径表达式(path-expression)(与此相反,你应当使用组件的一个属性来结尾)。
举例来说,如果store.owner含有一个包含了组件的实体address
store.owner.address.city//正确
store.owner.address//错误!
一个“任意”类型有两个特殊的属性id和class,来允许我们按照下面的方式表达一个连接(AuditLog.item是一个属性,该属性被映射为<
any>
)。
fromAuditLoglog,Paymentpayment
wherelog.item.class='
Payment'
andlog.item.id=payment.id
注意,在上面的查询与句中,log.item.class和payment.class将涉及到完全不同的数据库中的列。
15.8.表达式
在where子句中允许使用的表达式包括大多数你可以在SQL使用的表达式种类:
数学运算符+,-,*,/
二进制比较运算符=,>
=,<
>
!
=,like
逻辑运算符and,or,not
in,notin,between,isnull,isnotnull,isempty,isnotempty,memberofandnotmemberof
"
简单的"
case,case...when...then...else...end,和"
搜索"
case,casewhen...then...else...end
字符串连接符...||...orconcat(...,...)
current_date(),current_time(),current_timestamp()
second(...),minute(...),hour(...),day(...),month(...),year(...),
EJB-QL3.0定义的任何函数或操作:
substring(),trim(),lower(),upper(),length(),locate(),abs(),sqrt(),bit_length()
coalesce()和nullif()
cast(...as...),其第二个参数是某Hibernate类型的名字,以及extract(...from...),只要ANSIcast()和extract()被底层数据库支持
任何数据库支持的SQL标量函数,比如sign(),trunc(),rtrim(),sin()
JDBC参数传入?
命名参数:
name,:
start_date,:
x1
SQL直接常量'
foo'
69,'
1970-01-0110:
00:
01.0'
Javapublicstaticfinal类型的常量eg.Color.TABBY
关键字in与between可按如下方法使用:
fromDomesticCatcatwherecat.namebetween'
A'
and'
B'
fromDomesticCatcatwherecat.namein('
Foo'
'
Bar'
Baz'
)
而且否定的格式也可以如下书写:
fromDomesticCatcatwherecat.namenotbetween'
fromDomesticCatcatwherecat.namenotin('
同样,子句isnull与isnotnull可以被用来测试空值(null).
在Hibernate配置文件中声明HQL“查询替代(querysubstitutions)”之后,布尔表达式(Booleans)可以在其他表达式中轻松的使用:
<
propertyname="
hibernate.query.substitutions"
true1,false0<
/property>
系统将该HQL转换为SQL语句时,该设置表明将用字符1和0来取代关键字true和false:
fromCatcatwherecat.alive=true
你可以用特殊属性size,或是特殊函数size()测试一个集合的大小。
fromCatcatwherecat.kittens.size>
0
fromCatcatwheresize(cat.kittens)>
对于索引了(有序)的集合,你可以使用minindex与maxindex函数来引用到最小与最大的索引序数。
同理,你可以使用minelement与maxelement函数来引用到一个基本数据类型的集合中最小与最大的元素。
fromCalendarcalwheremaxelement(cal.holidays)>
currentdate
fromOrderorderwheremaxindex(order.items)>
100
fromOrderorderwhereminelement(order.items)>
10000
在传递一个集合的索引集或者是元素集(elements与indices函数)或者传递一个子查询的结果的时候,可以使用SQL函数any,some,all,exists,in
selectmotherfromCatasmother,Cataskit
wherekitinelements(foo.kittens)
selectpfromNameListlist,Personp
wherep.name=someelements(list.names)
fromCatcatwhereexistselements(cat.kittens)
fromPlayerpwhere3>
allelements(p.scores)
fromShowshowwhere'
fizard'
inindices(show.acts)
注意,在Hibernate3种,这些结构变量-size,elements,indices,minindex,maxindex,minelement,maxelement-只能在where子句中使用。
一个被索引过的(有序的)集合的元素(arrays,lists,maps)可以在其他索引中被引用(只能在where子句中):
fromOrderorderwhereorder.items[0].id=1234
selectpersonfromPersonperson,Calendarcalendar
wherecalendar.holidays['
nationalday'
]=person.birthDay
andperson.nationality.calendar=calendar
selectitemfromItemitem,Orderorder
whereorder.items[order.deliveredItemIndices[0]]=itemandorder.id=11
whereorder.items[maxindex(order.items)]=itemandorder.id=11
在[]中的表达式甚至可以是一个算数表达式。
whereorder.items[size(order.items)-1]=item
对于一个一对多的关联(one-to-manyassociation)或是值的集合中的元素,HQL也提供内建的index()函数,
selectitem,index(item)fromOrderorder
joinorder.itemsitem
whereindex(item)<
5
如果底层数据库支持标量的SQL函数,它们也可以被使用
fromDomesticCatcatwhereupper(cat.name)like'
FRI%'
如果你还不能对所有的这些深信不疑,想想下面的查询。
如果使用SQL,语句长度会增长多少,可读性会下降多少:
selectcust
fromProductprod,
Storestore
innerjoinstore.customerscust
whereprod.name='
widget'
andstore.location.namein('
Melbourne'
Sydney'
andprod=allelements(cust.currentOrder.lineItems)
提示:
会像如下的语句
SELECTcust.name,cust.address,cust.phone,cust.id,cust.current_order
FROMcustomerscust,
storesstore,
locationsloc,
store_customerssc,
productprod
WHEREprod.name='
ANDstore.loc_id=loc.id
ANDloc.nameIN('
ANDsc.store_id=store.id
ANDsc.cust_id=cust.id
ANDprod.id=ALL(
SELECTitem.prod_id
FROMline_itemsitem,orderso
WHEREitem.order_id=o.id
ANDcust.current_order=o.id
15.9.orderby子句
查询返回的列表(list)可以按照一个返回的类或组件(components)中的任何属性(property)进行排序:
fromDomesticCat
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- HQL Hibernate查询语言 Hibernate 查询 语言