2012HQL超级最新收集大全套书

上传人:yx****d 文档编号:158191968 上传时间:2022-10-03 格式:DOC 页数:10 大小:44KB
收藏 版权申诉 举报 下载
2012HQL超级最新收集大全套书_第1页
第1页 / 共10页
2012HQL超级最新收集大全套书_第2页
第2页 / 共10页
2012HQL超级最新收集大全套书_第3页
第3页 / 共10页
资源描述:

《2012HQL超级最新收集大全套书》由会员分享,可在线阅读,更多相关《2012HQL超级最新收集大全套书(10页珍藏版)》请在装配图网上搜索。

1、ibernateHQ大全aa() Hibrnae配备了一种非常强大的查询语言,这种语言看上去很像QL。但是不要被语法结构上的相似所迷惑,HL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态 和关联之类的概念.第 1 章 HQL: iberate查询语言Hbene配备了一种非常强大的查询语言,这种语言看上去很像SQ。但是不要被语法结构上的相似所迷惑,HQ是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态 和关联之类的概念.5.大小写敏感性问题除了Jaa类与属性的名称外,查询语句对大小写并不敏感。 所以 SeLeCT与 sELEt 以及 SELECT 是相同的,但是

2、org。hibrnate.eg。F 并不等价于 org.hibernat.e。Fo 并且 foo。barSet 也不等价于 fo。BRSET.本手册中的H关键字将使用小写字母。 很多用户发现使用完全大写的关键字会使查询语句 的可读性更强, 但我们发现,当把查询语句嵌入到va语句中的时候使用大写关键字比较难看。15。 from子句Hiernt中最简单的查询语句的形式如下:frot该子句简单的返回eg。Cat类的所有实例. 通常我们不需要使用类的全限定名, 因为 ato-mpt(自动引入)是缺省的情况。所以我们几乎只使用如下的简单写法:froCat大多数情况下,你需要指定一个别名, 原因是你可能需

3、要 在查询语句的其它部分引用到af Cat s cat这个语句把别名at指定给类Ct 的实例, 这样我们就可以在随后的查询中使用此别名了。 关键字a是可选的,我们也可以这样写:frm C at子句中可以同时出现多个类, 其查询结果是产生一个笛卡儿积或产生跨表的连接。fom orla, Paaterfrom Fomula as form, Paramete as param查询语句中别名的开头部分小写被认为是实践中的好习惯, 这样做与ava变量的命名标准保持了一致 (比如,domesCt).15. 关联(Asociation)与连接(oin)我们也可以为相关联的实体甚至是对一个集合中的全部元素指

4、定一个别名, 这时要使用关键字jin.fr Cat s cat inne ji cat。mate matelet outerjoin ct。kittes asittenfromCat cat ef in at。mat。kites a kttensfro mula for full joinfom.aramer prm受支持的连接类型是从NSISQL中借鉴来的。 innrjin(内连接) eft utr jo(左外连接)* righouter (右外连接) *fll oi (全连接,并不常用)语句inner jon, ft outer joi 以及rght outr jon 可以简写。fom C

5、tascatoin cat。matamelef ont.kitns skittn还有,一个”fetc”连接允许仅仅使用一个选择语句就将相关联的对象或一组值的集合随着他们的父对象的初始化而被初始化,这种方法在使用到集合的情况下尤其有用,对于关联和集合来说,它有效的代替了映射文件中的外联接与延迟声明(la dcrations)。 查看第 20.1 节 “ 抓取策略(etching strategies) 以获得等多的信息.fm t as ca nn oi ech cat.ate lf jin fchct。kitten一个etch连接通常不需要被指定别名,因为相关联的对象不应当被用在 hee 子句

6、(或其它任何子句)中。同时,相关联的对象并不在查询的结果中直接返回,但可以通过他们的父对象来访问到他们.注意fetch构造变量在使用了scoll()或 itae()函数 的查询中是不能使用的.最后注意,使用ful jn feth 与 rht jon eh是没有意义的。如果你使用属性级别的延迟获取(azyfechin)(这是通过重新编写字节码实现的),可以使用 fetch all popertes来强制Hbernate立即取得那些原本需要延迟加载的属性(在第一个查询中)。fromDocmet fet al poertie orebynefrmocuentoftch l operties wher

7、 lwe)ike ats%15。4。let子句eet 子句选择将哪些对象与属性返 回到查询结果集中 考虑如下情况:seect mtfromCata cat innerjoin cat。e as ate该语句将选择ts o oter Cts。(其他猫的配偶) 实际上, 你可以更简洁的用以下的查询语句表达相同的含义:etca。mat fromCt cat查询语句可以返回值为任何类型的属性,包括返回类型为某种组件(omponn)的属性:sec rm DoesiCt catwhr lik riele.fistNa from Cusoe as cust查询语句可以返回多个对象和(或)属性,存放在 Ojc

8、队列中,sletmother, osp,rm DoesticCat as moher inner jin moh.mt as mat let oter oi mther。ktes as ofsp或存放在一个List对象中,eect new lis(mtr,os, )from DomticCaasmther ine jn mth.mate as mate left oter joi mother。kttenas offs也可能直接返回一个实际的类型安全的ava对象,eec ew amily(moer, mae, offspr)from DomsicCat a mtherjoin moterma

9、s mate lef joi moter。itn soffspr假设类aml有一个合适的构造函数.你可以使用关键字a给“被选择了的表达式”指派别名:selet max(boyeight) a max, n(bodyeiht) as min,coun(*) as nromCat ca这种做法在与子句slet ne mp一起使用时最有用:selt ew mp( (bodWeiht) as max, m(boyeih)sin,coun(*) as n )fro Ca cat该查询返回了一个p的对象,内容是别名与被选择的值组成的名值映射。15。聚集函数HL查询甚至可以返回作用于属性之上的聚集函数的计算

10、结果:selec avg(catweght), sm(c。wight),max(catweght), unt(a)fomCat cat受支持的聚集函数如下:*av(.),sum(。), mn(。),x(.。.) * ct(*) * cunt(.), cunt(disinc .),cont(l.。)你可以在选择子句中使用数学操作符、连接以及经过验证的SQL函数:selc catwight+ u(iten.wight)from Cat cat jnatkiten ktengrop y atid,cat。wegselect firsame| |intil| uper(stNme) ro erson关

11、键字distin与all 也可以使用,它们具有与SQL相同的语义。seec isti fr Cat catelet count(disinc), con(ct) fr Cat cat5。6. 多态查询一个如下的查询语句:from Ct as ct不仅返回Ct类的实例,也同时返回子类 DomestcCat的实例。 Hibernat 可以在fom子句中指定任何 Java 类或接口 查询会返回继承了该类的所有持久化子类的实例或返回声明了该接口的所有持久化类的实例.下面的查询语句返回所有的被持久化的对象:frmalang。bec o接口Nme 可能被各种各样的持久化类声明:fm Nmedn, Name

12、 mwhe = mnam注意,最后的两个查询将需要超过一个的LSEECT这表明order y子句 没有对整个结果集进行正确的排序 (这也说明你不能对这样的查询使用Query.crol()方法。)15.7. where子句wre子句允许你将返回的实例列表的范围缩小。 如果没有指定别名,你可以使用属性名来直接引用属性:from Cat wernmFrtz如果指派了别名,需要使用完整的属性名:frm Cat s catwerFr返回名为(属性nam等于)Frit的Cat类的实例。select forom o o,ararwhere oo.satate adat将返回所有满足下面条件的Foo类的实例:

13、存在如下的br的一个实例,其ate属性等于oo的statDate属性。复合路径表达式使得whee子句非常的强大,考虑如下情况:fromCat ctwher not null该查询将被翻译成为一个含有表连接(内连接)的Q查询。如果你打算写像这样的查询语句rom o fo wher foo.rbz。ustomeraddress.ciy is n null在QL中,你为达此目的将需要进行一个四表连接的查询。=运算符不仅可以被用来比较属性的值,也可以用来比较实例:frm Ca cat, Cat ri where cat.mae= rial.atesct cat, matfrom Ca cat, atm

14、atewhere ctat mte特殊属性(小写)id可以用来表示一个对象的唯一的标识符。(你也可以使用该对象的属性名。)frm Ct as cawer ct.d = 123frm C a awere c.mate。id =6第二个查询是有效的.此时不需要进行表连接!同样也可以使用复合标识符.比如Person类有一个复合标识符,它由cnry属性与mdicaNuber属性组成.rm bank.Pron ersneeersni。country = AU nd erso。d。medicarumer 1235from bankAccou accountwher acount。w.id。cuny = A

15、andaccount.ownd.mediareNm=24第二个查询也不需要进行表连接。同样的,特殊属性ls在进行多态持久化的情况下被用来存取一个实例的鉴别值(dirminator lue)。一个嵌入到er子句中的Java类的名字将被转换为该类的鉴别值。fom Cat t where ca。lass = DomesticCt你也可以声明一个属性的类型是组件或者复合用户类型(以及由组件构成的组件等等).永远不要尝试使用以组件类型来结尾的路径表达式(pathexrsion)(与此相反,你应当使用组件的一个属性来结尾)。 举例来说,如果stre。owner含有一个包含了组件的实体addresssor.

16、wer.ddesscity/正确tor。or.adess 错误!一个“任意类型有两个特殊的属性id和clas, 来允许我们按照下面的方式表达一个连接(AudiL.item 是一个属性,该属性被映射为)。from udiLoglog,ayment payetwhere l。iem。class = Payment an logitem。i = pymen。i注意,在上面的查询与句中,log.itmcass 和 paymnt.cass将涉及到完全不同的数据库中的列.158 表达式在hee子句中允许使用的表达式包括 大多数你可以在L使用的表达式种类: 数学运算符+,, *, /二进制比较运算符=, ,

17、=,,!=, li*逻辑运算符and,r,not in,not in, btwee,i null,is no nul, is empt,is n emt, ber of and membr f ”简单的” a, cse 。 whn 。. ten。. lse.。 en,和 ”搜索” case, case whe .。 the 。.。 ls 。. n *字符串连接符。.。|。. or oct(。,.) *currnt_dte(), curet_tme(),curen_tmetamp() *secon(。.), mite(。.),hur(。.), y(。), oh(。.), yar(。), EBQL

18、 3.0定义的任何函数或操作:substrig(),tm(), lowe(), upper(), length(),loa(), bs(), s(), it_length()coalesce() 和 nlli() ast(。 as。), 其第二个参数是某Hiberat类型的名字,以及extract(. from .),只要ANSI cst()和 extrct() 被底层数据库支持*何数据库支持的SQ标量函数,比如sign(), ruc(), rtrim(), in() DBC参数传入? 命名参数:nam, :st_date, :x1*SQL 直接常量 fo, 69, 1970-011 1:0:

19、0. Jvbic sttic ial 类型的常量 eg。oor。TABY关键字i与betwen可按如下方法使用:from DosticCat ct her etween d Brm DmsicCat ct w in( o,Bar, Bz )而且否定的格式也可以如下书写:ro Doesticat cat her nt beteenA d fom DoesicCt c whr not i ( Foo, Bar, Bz )同样, 子句isull与snotul可以被用来测试空值(ul).在Hbente配置文件中声明QL“查询替代(qer ubstiuions)之后,布尔表达式(Boolean)可以在其

20、他表达式中轻松的使用:tre ,fase 100fromOrdr rd where mnelemt(rer.iems) 10000在传递一个集合的索引集或者是元素集(ments与indices 函数)或者传递一个子查询的结果的时候,可以使用SL函数ny, soe,al, eiss, insele othefrm t as mother, at askitwre kt in elments(foo.kien)slect rom NameLit lit, Persoper =somlements)from Cat cat her eists element(ct.kittens)from lae

21、were3 all lemet(.soe)fom Showsowerefizard i indice(shw。acs)注意,在Hiert3种,这些结构变量- se,emet, indies, minindex, maxndex, inlme,maxeement 只能在where子句中使用.一个被索引过的(有序的)集合的元素(arays, lists, ma)可以在其他索引中被引用(只能在ere子句中):from rerorder where ode.items0。d =1234seleteron frm esoperon, Calenar caendrwheecaend.holiasnatio

22、nal a= person。bihay alendar= caedasect item foItitem,Oder odwhee orderiemsorer。livereItmInies0 =item adore。id =11elect te fom Iteitem, rdeoderhre rer。temsmindex(orderites) =im and orded =11在中的表达式甚至可以是一个算数表达式。slct em froItitem, rdr orderwere orer。tems size(order.ims) -1 = iem对于一个一对多的关联(ne-o-many asoc

23、iatin)或是值的集合中的元素,QL也提供内建的ine()函数,eletim, ne(item)rom Oer orderjoi ordr。tems itmwhereide(tem) 5如果底层数据库支持标量的SQL函数,它们也可以被使用frm DomestcCact heruppe) ik FRI%如果你还不能对所有的这些深信不疑,想想下面的查询.如果使用SQ,语句长度会增长多少,可读性会下降多少:seletcustfrm Prout pro, t stor nner join stoeustomers cstwher idtan n ( Mebourne, Syne) d prod al

24、l eements(cust.currenrder。linems)提示: 会像如下的语句SL,cus.addrs, u。one, custid,cut。urrent_orderOM customescu, sores sto, loations loc, tore_cumes s,rodct podWHER = widgetAD sore。locd = lc.d A IN ( lbourne, yey) ANsc。stoe_d=storedA sc.cst_id = cst.id AD prod。 = LL(SELEC ite.prod_ ROM liitms te,ordes oWHERE

25、itemrd_id = o.id AND cstcurtrder = oid )15.9. order y子句查询返回的列表(list)可以按照一个返回的类或组件(compes)中的任何属性(popery)进行排序:from DometicCatcatodr bas, ca。eght desc,tbrhdate可选的asc或es关键字指明了按照升序或降序进行排序1510. gropby子句一个返回聚集值(aggregatevaues)的查询可以按照一个返回的类或组件(copnets)中的任何属性(operty)进行分组:seec cat.colo, um(aeiht), cont(ct)fom

26、 Ca catgru by ct。colorselect fo.id, av(nme), max(na)frm Foo foojis nmegrupby foo.ihavn子句在这里也允许使用.elec cat.coor,m(caweight), ont(ct)fo Cat atgopby ca。colorhving ct。clor in (e.ColoABY, egolr.BLACK)如果底层的数据库支持的话(例如不能在SQL中使用),SQL的一般函数与聚集函数也可以出现 在avng与r by 子句中。slect cato Cat catjoncat。ktten kittenrou b ca

27、havigav(kitten。weiht) 100e b nt(ien) sc, (kttn.weiht) desc注意gop by子句与 rder by子句中都不能包含算术表达式(armetic expesons).1。子查询对于支持子查询的数据库,Hibenae支持在查询中使用子查询。一个子查询必须被圆括号包围起来(经常是SQL聚集函数的圆括号)。甚至相互关联的子查询(引用到外部查询中的别名的子查询)也是允许的.ro Cat afatcatwer fatcat。weigh(slec ag(cat.weig) fro DomesicCatat)fo DesticCt ascater = om

28、e ( selectame。nckNae rom ame asnae)fromt as catwhere oteists (f t a mte whre mte.mae =ca)rom mestiC as catwhe ( elct nm.nickme from Nam asnam)在set列表中包含一个表达式以上的子查询,你可以使用一个元组构造符(te conrutors):fro C s awher ot ( , cat。coor ) in (selec, at。olorfrm osCat c)注意在某些数据库中(不包括Oracle与HSL),你也可以在其他语境中使用元组构造符, 比如查询

29、用户类型的组件与组合:rm Persn wer name =(Gavn, A, ig)该查询等价于更复杂的:fom Pon her e。first = Gavin and nameintial=A and name。at =Kng)有两个很好的理由使你不应当作这样的事情:首先,它不完全适用于各个数据库平台;其次,查询现在依赖于映射文件中属性的顺序。1。1。HQL示例bernate查询可以非常的强大与复杂。实际上,Hibente的一个主要卖点就是查询语句的威力。这里有一些例子,它们与我在最近的一个项目中使用的查询非常相似.注意你能用到的大多数查询比这些要简单的多!下面的查询对于某个特定的客户的所

30、有未支付的账单,在给定给最小总价值的情况下,返回订单的id,条目的数量和总价值,返回值按照总价值的结果进行排序。为了决定价格,查询使用了当前目录。作为转换结果的SQL查询,使用了ODER, RDE_LI, PRODUT, CATALOG 和PRIE 库表.seet red,sum(pice.amount),cut(tem)fro Ode as ore oin ordelnItems stemoin iteprdut sprduct, Catalog as atog joncatlogprice asprcewhere ordr。paid ale an or。comer = :custo and

31、 rceprodut = prouct tog。effetiDate sysdate and ctageciveDe = all ( seleccafectiveae from atlo aat where atfctiveDt sysdate )group by erhvig um(prceaont) :minAmoutorderbsum(prie。amont) des这简直是一个怪物!实际上,在现实生活中,我并不热衷于子查询,所以我的查询语句看起来更像这个:select rerd, s(pice。aunt), coun(tem)from Ore as orde jin ore。lineIt

32、ems as tem join im.produc asprduct, Catalgas caaog onctaogprices asriehre ord.pa = als an orr.cusomer = :customr nprc.produc = prdct andctalog = :cuCtloggrou b oderav um(pice。amount) :inAmotorde by sm(priceamot) des下面一个查询计算每一种状态下的支付的数目,除去所有处于AWAIT_APRVA状态的支付,因为在该状态下当前的用户作出了状态的最新改变。该查询被转换成含有两个内连接以及一个

33、相关联的子选择的SQL查询,该查询使用了表PAYMENT, AYET_STTUS以及 PYMT_STATUS_CHANGE。seleccout(pet), from Payment s paymentin pyentcurretStats sttus jonpayensauChangs statsChaewhe PamntSttusWITING_PPROAL r ( tashge.timeSt ( select ma(change。timeStamp) rom PayenStusCae change where changpaymnt = paymnt ) ne :crsr )goup, ta

34、tussOrerodr by stus。strder如果我把statusChanges实例集映射为一个列表(lt)而不是一个集合(), 书写查询语句将更加简单。seet coun(paent), frmPaymnt as paymtjin yentcuentStatus as stauswhe ayntttus。WAITING_APOVA or paymet.stasCange maxdex(pyment.stausChnges) .ur :currentUsergrup b, status.sortrerrdeby stus。sOrer下面一个查询使用了MS SQL Sev的 isNll()

35、函数用以返回当前用户所属组织的组织帐号及组织未支付的账.它被转换成一个对表ACUNT,PAMET, PYMT_SAUS, ACOUNT_TPE, OGANIZATIO 以及 _SR进行的三个内连接, 一个外连接和一个子选择的SL查询.sec acount,paymenfrm At s ccount eft er join acou。aent as paymentere :crretUsr in eter)and PaymentStausUPAID Nul, Paymentttus.UNAI)rer by acount.type.orOrder,accont。accoNumber, paymen

36、。ueDte对于一些数据库,我们需要弃用(相关的)子选择。ect acount,aymenfo Acut asaccount jers a uselet ouerjoin acout。payent as paymentwhere :curetsr = user an PaymenStuUPAI = isNl, PaymentSttu.UNPAD)de baccout.type.otOde, account.countNumbr, aymen。deate1.13。批量的UPATE & DLETE语句L现在支持PATE与DELETE语句. 查阅 第14节“大批量更新/删除(lkudatdeet)”

37、以获得更多信息。15.14。 小技巧 小窍门你可以统计查询结果的数目而不必实际的返回他们:((nger)essinitere(”elcount()ro 。.”).ne())tValue()若想根据一个集合的大小来进行排序,可以使用如下的语句:selctusr, from ser susr lft jon usr.ssges s msggoupby s.d,orer by unt(msg)如果你的数据库支持子选择,你可以在你的查询的whr子句中为选择的大小(seletionize)指定一个条件:fro ser srhesize(us.messges) = 1如果你的数据库不支持子选择语句,使用下

38、面的查询:slec usr.d, from Ue join usr。megesmggop by usr.i, hvingou(mg) = 1因为内连接(iner joi)的原因,这个解决方案不能返回含有零个信息的User 类的实例,所以这种情况下使用下面的格式将是有帮助的:electus.i, fom User as usr left jin usr.message assgroupby srid, havingcont(m)= 0Javean的属性可以被绑定到一个命名查询(nme uery)的参数上:Qury q = sceateue(from foo Foo as foo wer=:nm

39、an fo.size=:siz”);qsetProprtes(oBean); / Ban包含方法getae()与getSz()Lit foos = 。list();通过将接口Query与一个过滤器(filter)一起使用,集合(Collctions)是可以分页的:Queyq =screatilter( collecin,”); / 一个简单的过滤器。setMaxRults(PE_SI);q.setFirstRsult(PGE_IZ * pagber);Listpage= q.lt();通过使用查询过滤器(uey lter)可以将集合(Colection)的原素分组或排序:ollcon oedCollecon s.filter( clctin, orderby ths.amount);Collctionns 。fie( colltion,selec thstyp, count(thi) roup b 。ye );不用通过初始化,你就可以知道一个集合(Cecti)的大小:( (tger) sssin.ierat(selctcot() rm .。”)。ext() )。intVaue();文中不足之处,请您见谅!10 / 10

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!