国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

另類查詢 Hibernate HQL 深度歷險(xiǎn)

2019-11-18 15:26:08
字體:
供稿:網(wǎng)友

  傳統(tǒng)的SQL語言采用的是結(jié)構(gòu)化的查詢方法,而這種方法對(duì)于查詢以對(duì)象形式存在的數(shù)據(jù)卻無能為力。幸運(yùn)的是,Hibernate為我們提供了一種語法類似于SQL的語言,Hibernate查詢語言(HQL),和SQL不同的是,HQL是一種面向?qū)ο蟮牟樵冋Z言,它可以查詢以對(duì)象形式存在的數(shù)據(jù)。因此,本文就HQL如何工作以及如何使用HQL展開了深入的討論。

  SQL本身是非常強(qiáng)大的。當(dāng)SQL的這種強(qiáng)大和處理面向?qū)ο髷?shù)據(jù)的能力相結(jié)合時(shí),就產(chǎn)生了HQL。和SQL一樣,HQL提供了豐富的查詢功能,如投影查詢、聚合函數(shù)、分組和約束。任何復(fù)雜的SQL都可以映射成HQL。

  本文的第一部分將討論HQL的簡單用法。第二部分將討論在HQL中如何根據(jù)上下文關(guān)系進(jìn)行查詢。在第三部分將以一個(gè)例子來說明如何在實(shí)際應(yīng)用中使用HQL。

  進(jìn)入HQL世界

  一個(gè)ORM框架是建立在面向?qū)ο蟮幕A(chǔ)上的。最好的例子是Hibernate如何提供類SQL查詢。雖然HQL的語法類似于SQL,但實(shí)際上它的查詢目標(biāo)是對(duì)象。HQL擁有面向?qū)ο笳Z言的所有的特性,這其中包括多態(tài)、繼續(xù)和組合。這就相當(dāng)于一個(gè)面向?qū)ο蟮腟QL,為了提供更強(qiáng)大的功能,HQL還提供了很多的查詢函數(shù)。這些函數(shù)可以被分為四類:

  1. 投影函數(shù)

  2. 約束函數(shù)

  3. 聚合函數(shù)

  4. 分組函數(shù)

  使用HQL可以建立簡單的查詢,也可以建立更復(fù)雜的查詢。在本文中并不討論那些非常復(fù)雜的查詢,如含有子查詢和很多連接的查詢。本文只討論連接兩個(gè)表的查詢。現(xiàn)在讓我們開始接近HQL吧!

  投影

  如謂投影,就是一個(gè)可以訪問的對(duì)象或?qū)ο蟮膶傩?。在HQL中,可以使用from和select子句來完成這個(gè)工作。

  from子句返回指定的類的所有實(shí)例。如from Order將返回Order類的所有實(shí)例。換句話說,以上的查詢相當(dāng)于以下的SQL語句:

select * from order
  from 是最簡單的查詢子句。from后面可以跟一個(gè)或多個(gè)類名(類名也可以帶有別名)。為了得到Order和PRodUCt的所有實(shí)例,可以使用如下的查詢:

from Order, Product
  和類名一樣,別名也可以在from后使用,如下代碼如示:

from Order as o, Product p
  當(dāng)查詢很復(fù)雜時(shí),加入別名可以減少語句的長度。我們可以看看如下的SQL語句:

select o.*, p.* from order o, product p where o.order_id = p.order_id
  我們可以很輕易看出,上面的查詢是一對(duì)多的關(guān)系。在HQL中相當(dāng)于一個(gè)類中包含多個(gè)其它類的實(shí)例。因此,以上的SQL寫成HQL就是:

from Order as o inner join o.products as product
  現(xiàn)在讓我們考慮另外一個(gè)從表中得到指定屬性的情況。這就是最常用的select子句。這在HQL中的工作方式和SQL中一樣。而在HQL中,假如只是想得到類的屬性的話,select語句是最后的選擇。以上的SQL可以使用select子句改成如下的HQL語句:

select product from Order as o inner join o.products as product
  以上的HQL語句將返回Order中的所有Products實(shí)例。假如要得到對(duì)象的某一個(gè)屬性,可以將HQL語句寫成如下的形式:

select product.name from Order as o inner join o.products as product
  假如要得到多個(gè)對(duì)象的屬性,可以將HQL語句寫成如下形式:

select o.id, product.name from Order as o inner join o.products as product
  接下來,我們將進(jìn)入下一個(gè)議題。假設(shè)我們需要根據(jù)某些條件得到數(shù)據(jù)。那么以上所述的HQL語句將無法滿足需求。為了達(dá)到這一目的,我們就要用到下面將要討論的約束子句。 約束

  從以上可知,投影返回的是所有的數(shù)據(jù)。但在大多數(shù)時(shí)候我們并不需要這么多數(shù)據(jù)。這就需要對(duì)數(shù)據(jù)進(jìn)行過濾。在HQL中過濾數(shù)據(jù)的子句和SQL一樣,也是where。它的語法類似于SQL,通過where子句,可以對(duì)行進(jìn)行過濾。我們可以看看下面的SQL語句:

select * from orders where id = ‘1234’
  這條查詢語句返回了id等于1234的所有的字段。和這條SQL對(duì)等的是下面的HQL語句:

select o from Order o where o.id=’1234’
  從以上兩條語句可以看出,它們的where子句非常相似。而它們唯一的不同是SQL操作的是記錄,而HQL操作的是對(duì)象。在HQL中,除了where子句可以過濾數(shù)據(jù)外,having子句也可以做到這一點(diǎn)(關(guān)于having子句的具體內(nèi)容我將在分組部分討論)。投影和約束是兩個(gè)基本的操作,這兩個(gè)操作再加上聚合函數(shù)的話,那HQL將變得更加強(qiáng)大。下面我們就來討論什么是聚合。

  聚合

  上述的查詢都是將每一個(gè)記錄(對(duì)象)當(dāng)做一個(gè)單位,而假如使用聚合,可以將一類記錄(對(duì)象)當(dāng)做一個(gè)單位。然后再對(duì)每一類的記錄(對(duì)象)進(jìn)行一系列地操作,如對(duì)某一列取平均值、求和、統(tǒng)計(jì)行數(shù)等等。HQL支持以下的聚合函數(shù):

  1. avg(…), sum(…)
  2. min(…), max(…)
  3. count(*), count(…), count(distinct…), count(all…)

  以上的聚合函數(shù)都返回?cái)?shù)值類型。這些操作都可以在select子句中使用,如下所示:



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 兴山县| 汾阳市| 全州县| 湛江市| 广宁县| 遵义市| 泰州市| 孝昌县| 彰武县| 邛崃市| 荆门市| 大安市| 潍坊市| 平顶山市| 南江县| 镇坪县| 内丘县| 寻甸| 连州市| 香河县| 荥经县| 集安市| 小金县| 威信县| 南城县| 大宁县| 泰兴市| 沈阳市| 屏山县| 新干县| 彭州市| 延津县| 滨州市| 饶阳县| 刚察县| 兴山县| 黄石市| 水城县| 岐山县| 霍城县| 太谷县|