hibernate的HQL查询语言总结
HQL是Hibernate Query Language的縮寫,HQL的語法很像SQL的語法,但HQL是一種面向?qū)ο蟮牟樵冋Z言。因此,SQL的操作對象是數(shù)據(jù)表和列等數(shù)據(jù)對象,而HQL的操作對象是類、實(shí)例、屬性等。
HQL是完全面向?qū)ο蟮牟樵冋Z言,因此可以支持繼承和多態(tài)等特征
HQL查詢的步驟:
1,獲取 Hibernate Session 對象。
2,編寫HQL語句。
3,以HQL為參數(shù),調(diào)用Session的createQuery創(chuàng)建查詢對象(如果HQL語句有參數(shù),調(diào)用Query的set方法賦值)。
4,調(diào)用Query對象的list等方法返回實(shí)例。
如:
<span style="font-size:24px;"> LearningDAO learningDao=new LearningDAO();Configuration cfg=new Configuration().configure();SessionFactory sessionFactory=learningDao.getSessionFactory();Session session=sessionFactory.openSession();//獲得session對象Transaction tran=session.beginTransaction();Query query=session.createQuery("from Learning");//HQL語句,創(chuàng)建Query對象List list=query.list();for(int i=0;i<list.size();i++){Learning l=(Learning)list.get(i);System.out.println(l.getId());} </span>
HQL語句的常用語法:
HQL語句本身是不區(qū)分大小寫的。也就是說,HQL語句的關(guān)鍵字和函數(shù)都是不區(qū)分大小寫的。但HQL語句中所使用的包名、類名、實(shí)例名和屬性名都區(qū)分大小寫
1,HQL查詢的from子句
from子句是最簡單的HQL語句,也是最基本的HQL語句。from關(guān)鍵字后緊跟持久化類的類名,
例如:
from City ?;表明從City持久化類中選出全部的實(shí)例。
大部分時候,推薦為該City的每個實(shí)例起別名。
例如:
from City as c
在上面的HQL語句中,City持久化類中的實(shí)例的別名為c,既然 c是實(shí)例名,因此也應(yīng)該遵守Java的命名規(guī)則:第一個單詞的首字母小寫,后面每個單詞的首字母大寫。
命名別名時,as關(guān)鍵字是可選的,但為了增加可讀性,建議保留。
例如:
from City ?c
from后還可同時出現(xiàn)多個持久化類,此時將產(chǎn)生一個笛卡兒積或跨表的連接。
2,HQL查詢的select子句:
select 子句選擇將哪些對象與屬性返 回到查詢結(jié)果集中.select子句用于確定選擇出的屬性,當(dāng)然select選擇的屬性必須是from后持久化類包含的屬性
select可以選擇任意屬性,不僅可以選擇持久化類的直接屬性,還可以選擇組件屬性包含的屬性,
例如:
<span style="font-size:24px;">select new list(p.name , p.address) from Person as p</span>
甚至可以將選擇出的屬性直接封裝成對象,例如:
<span style="font-size:24px;">select new ClassTest(p.name , p.address) from Person as p</span>
前提是ClassTest支持p.name和p.address的構(gòu)造器,假如p.name的數(shù)據(jù)類型是 String,p.address的數(shù)據(jù)類型是String,則ClassTest必須有如下的構(gòu)造器:
ClassTest(String s1, String s2)
select還支持給選中的表達(dá)式命名別名,例如:
<span style="font-size:24px;">select p.name as personName from Person as p</span>
<span style="font-size:24px;">select new map(p.name as personName) from Person as p</span> 在這種情形下,選擇出的是Map結(jié)構(gòu),以personName為key,實(shí)際選出的值作為value。
3,HQL查詢的聚集函數(shù)
HQL查詢甚至可以返回作用于屬性之上的聚集函數(shù)的計算結(jié)果:
● count,統(tǒng)計選擇對象的數(shù)量。
● max,統(tǒng)計屬性值的最大值
● min,統(tǒng)計屬性值的最小值。
● sum,計算屬性值的總和。
4,多態(tài)查詢
HQL語句被設(shè)計成能理解多態(tài)查詢,from后跟的持久化類名,不僅會查詢出該持久化類的全部實(shí)例,還會查詢出該類的子類的全部實(shí)例
下面的查詢語句:
該查詢語句 不僅會查詢出Person的全部實(shí)例,還會查詢出Person的子類,如Teacher的全部實(shí)例, 前提是Person和Teacher完成了正確的繼承映射。
5,HQL查詢的where子句
where子句允許你將返回的實(shí)例列表的范圍縮小. 如果沒有指定別名,你可以使用屬性名來直接引用屬性:
from Cat where name='Fritz'
如果指派了別名,需要使用完整的屬性名:
from Cat as cat where cat.name='Fritz'
返回名為(屬性name等于)'Fritz'的Cat類的實(shí)例。
復(fù)合屬性表達(dá)式加強(qiáng)了where子句的功能,例如如下HQL語句:
from Cat cat where cat.mate.name like "kit%"
該查詢將被翻譯成為一個含有內(nèi)連接的SQL查詢,翻譯后的SQL語句如下:
再看下面的HQL查詢語句:
from Foo foo where foo.bar.baz.customer.address.city like"guangzhou%"
翻譯成SQL查詢語句,將變成一個四表連接的查詢。
=運(yùn)算符不僅可以被用來比較屬性的值,也可以用來比較實(shí)例:
from Cat cat, Cat rival where cat.mate = rival.mate select cat, mate from Cat cat, Cat mate where cat.mate = mate
where子句中的表達(dá)式:
● 數(shù)學(xué)運(yùn)算符+、–、*、/?等。
● 二進(jìn)制比較運(yùn)算符=、>=、<=、<>、!=、like等。
● 邏輯運(yùn)算符and、or、not等。
● in、not in、between、is null、is not null、is empty、is not empty、member of和not member of等。
● 簡單的case、case ... when ... then ... else ... end和case、case when ... then ... else ... end等。
● 字符串連接符value1 || value2或使用字符串連接函數(shù)concat(value1 , value2)。
● 時間操作函數(shù)current_date()、current_time()、current_timestamp()、second()、minute()、hour()、day()、month()、year()等。
● HQL還支持EJB-QL 3.0所支持的函數(shù)或操作substring()、trim()、lower()、upper()、length()、locate()、abs()、sqrt()、bit_length()、coalesce()和nullif()等。
● 還支持?jǐn)?shù)據(jù)庫的類型轉(zhuǎn)換函數(shù),如cast(... as ...),第二個參數(shù)是Hibernate的類型名,或者extract(... from ...),前提是底層數(shù)據(jù)庫支持ANSI cast()?和extract()。
● 如果底層數(shù)據(jù)庫支持如下單行函數(shù)sign()、trunc()、rtrim()、sin()。則HQL語句也完全可以支持。
● HQL語句支持使用?作為參數(shù)占位符,這與JDBC的參數(shù)占位符一致,也可使用命名參數(shù)占位符號,方法是在參數(shù)名前加冒號 :,例如 :start_date和:x1等。
● 當(dāng)然,也可在where子句中使用SQL常量,例如'foo'、69、'1970-01-01 10:00: 01.0'等。
● 還可以在HQL語句中使用Java public static final 類型的常量,例如eg.Color.TABBY。
除此之外,where子句還支持如下的特殊關(guān)鍵字用法。
● in與between...and可按如下方法使用:
● 當(dāng)然,也支持not in和not between...and的使用,例如:
from DomesticCat cat where cat.name not between 'A' and 'B' from DomesticCat cat where cat.name not in ( 'Foo','Bar','Baz' )
● 子句is null與is not null可以被用來測試空值,例如:
from DomesticCat cat where cat.name is null; from Person as p where p.address is not null;
如果在Hibernate配置文件中進(jìn)行如下聲明:
<property name="hibernate.query.substitutions">true 1, false 0</property>
上面的聲明表明,HQL轉(zhuǎn)換SQL語句時,將使用字符1和0來取代關(guān)鍵字true和false。然后將可以在表達(dá)式中使用布爾表達(dá)式,例如:
from Cat cat where cat.alive = true
● size關(guān)鍵字用于返回一個集合的大小,例如:
● 對于有序集合,還可使用minindex與maxindex函數(shù)代表最小與最大的索引序數(shù)。同理,可以使用minelement與maxelement函數(shù)代表集合中最小與最大的元素。 例如:
from Calendar cal where maxelement(cal.holidays) > current date from Order order where maxindex(order.items) > 100 from Order order where minelement(order.items) > 10000
● 可以使用SQL函數(shù)any、some、all、exists、in操作集合里的元素,例如:
//操作集合元素 select mother from Cat as mother, Cat as kit where kit in elements(foo.kittens) //p的name屬性等于集合中某個元素的name屬性 select p from NameList list, Person p where p.name = some elements(list.names) //操作集合元素 from Cat cat where exists elements(cat.kittens) from Player p where 3 > all elements(p.scores) from Show show where 'fizard' in indices(show.acts)
注意這些結(jié)構(gòu)變量size、elements、indices、minindex、maxindex、minelement、maxelement 等,只能在where子句中使用。
● where子句中,有序集合的元素(arrays, lists, maps)可以通過[ ]運(yùn)算符訪問。例如:
//items是有序集合屬性,items[0]代表第一個元素 from Order order where order.items[0].id = 1234//holidays是map集合屬性,holidays[national day]代表其中一個元素 select person from Person person, Calendar calendar where calendar.holidays['national day'] = person.birthDay and person.nationality.calendar = calendar//下面同時使用list 集合和map集合屬性 select item from Item item, Order order where order.items[ order.deliveredItemIndices[0] ] = item and order.id = 11 select item from Item item, Order order where order.items[ maxindex(order.items) ] = item and order.id = 11
6. order by子句
查詢返回的列表(list)可以根據(jù)類或組件屬性的任何屬性進(jìn)行排序,例如:
還可使用 asc或desc關(guān)鍵字指定升序或降序的排序規(guī)則,例如:
from Person as p order by p.name asc , p.age desc如果沒有指定排序規(guī)則,默認(rèn)采用升序規(guī)則。即是否使用asc關(guān)鍵字是沒有區(qū)別的,加asc是升序排序,不加asc也是升序排序。
7,group by子句
返回聚集值的查詢可以對持久化類或組件屬性的屬性進(jìn)行分組,分組所使用的group by子句??聪旅娴腍QL查詢語句:
select cat.color, sum(cat.weight), count(cat) from Cat cat group by cat.color having cat.color in (eg.Color.TABBY, eg.Color.BLACK)
注意: having子句用于對分組進(jìn)行過濾,因此having子句只能在有g(shù)roup by子句時才可以使用,沒有g(shù)roup by子句,不能使用having子句
總結(jié)
以上是生活随笔為你收集整理的hibernate的HQL查询语言总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hibernate中的核心接口query
- 下一篇: myeclipse自动生成hiberna