hibernate的HQL查询语言总结
HQL是Hibernate Query Language的縮寫,HQL的語法很像SQL的語法,但HQL是一種面向對象的查詢語言。因此,SQL的操作對象是數據表和列等數據對象,而HQL的操作對象是類、實例、屬性等。
HQL是完全面向對象的查詢語言,因此可以支持繼承和多態等特征
HQL查詢的步驟:
1,獲取 Hibernate Session 對象。
2,編寫HQL語句。
3,以HQL為參數,調用Session的createQuery創建查詢對象(如果HQL語句有參數,調用Query的set方法賦值)。
4,調用Query對象的list等方法返回實例。
如:
<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語句,創建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語句本身是不區分大小寫的。也就是說,HQL語句的關鍵字和函數都是不區分大小寫的。但HQL語句中所使用的包名、類名、實例名和屬性名都區分大小寫
1,HQL查詢的from子句
from子句是最簡單的HQL語句,也是最基本的HQL語句。from關鍵字后緊跟持久化類的類名,
例如:
from City ?;表明從City持久化類中選出全部的實例。
大部分時候,推薦為該City的每個實例起別名。
例如:
from City as c
在上面的HQL語句中,City持久化類中的實例的別名為c,既然 c是實例名,因此也應該遵守Java的命名規則:第一個單詞的首字母小寫,后面每個單詞的首字母大寫。
命名別名時,as關鍵字是可選的,但為了增加可讀性,建議保留。
例如:
from City ?c
from后還可同時出現多個持久化類,此時將產生一個笛卡兒積或跨表的連接。
2,HQL查詢的select子句:
select 子句選擇將哪些對象與屬性返 回到查詢結果集中.select子句用于確定選擇出的屬性,當然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的構造器,假如p.name的數據類型是 String,p.address的數據類型是String,則ClassTest必須有如下的構造器:
ClassTest(String s1, String s2)
select還支持給選中的表達式命名別名,例如:
<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結構,以personName為key,實際選出的值作為value。
3,HQL查詢的聚集函數
HQL查詢甚至可以返回作用于屬性之上的聚集函數的計算結果:
● count,統計選擇對象的數量。
● max,統計屬性值的最大值
● min,統計屬性值的最小值。
● sum,計算屬性值的總和。
4,多態查詢
HQL語句被設計成能理解多態查詢,from后跟的持久化類名,不僅會查詢出該持久化類的全部實例,還會查詢出該類的子類的全部實例
下面的查詢語句:
該查詢語句 不僅會查詢出Person的全部實例,還會查詢出Person的子類,如Teacher的全部實例, 前提是Person和Teacher完成了正確的繼承映射。
5,HQL查詢的where子句
where子句允許你將返回的實例列表的范圍縮小. 如果沒有指定別名,你可以使用屬性名來直接引用屬性:
from Cat where name='Fritz'
如果指派了別名,需要使用完整的屬性名:
from Cat as cat where cat.name='Fritz'
返回名為(屬性name等于)'Fritz'的Cat類的實例。
復合屬性表達式加強了where子句的功能,例如如下HQL語句:
from Cat cat where cat.mate.name like "kit%"
該查詢將被翻譯成為一個含有內連接的SQL查詢,翻譯后的SQL語句如下:
再看下面的HQL查詢語句:
from Foo foo where foo.bar.baz.customer.address.city like"guangzhou%"
翻譯成SQL查詢語句,將變成一個四表連接的查詢。
=運算符不僅可以被用來比較屬性的值,也可以用來比較實例:
from Cat cat, Cat rival where cat.mate = rival.mate select cat, mate from Cat cat, Cat mate where cat.mate = mate
where子句中的表達式:
● 數學運算符+、–、*、/?等。
● 二進制比較運算符=、>=、<=、<>、!=、like等。
● 邏輯運算符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或使用字符串連接函數concat(value1 , value2)。
● 時間操作函數current_date()、current_time()、current_timestamp()、second()、minute()、hour()、day()、month()、year()等。
● HQL還支持EJB-QL 3.0所支持的函數或操作substring()、trim()、lower()、upper()、length()、locate()、abs()、sqrt()、bit_length()、coalesce()和nullif()等。
● 還支持數據庫的類型轉換函數,如cast(... as ...),第二個參數是Hibernate的類型名,或者extract(... from ...),前提是底層數據庫支持ANSI cast()?和extract()。
● 如果底層數據庫支持如下單行函數sign()、trunc()、rtrim()、sin()。則HQL語句也完全可以支持。
● HQL語句支持使用?作為參數占位符,這與JDBC的參數占位符一致,也可使用命名參數占位符號,方法是在參數名前加冒號 :,例如 :start_date和:x1等。
● 當然,也可在where子句中使用SQL常量,例如'foo'、69、'1970-01-01 10:00: 01.0'等。
● 還可以在HQL語句中使用Java public static final 類型的常量,例如eg.Color.TABBY。
除此之外,where子句還支持如下的特殊關鍵字用法。
● in與between...and可按如下方法使用:
● 當然,也支持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配置文件中進行如下聲明:
<property name="hibernate.query.substitutions">true 1, false 0</property>
上面的聲明表明,HQL轉換SQL語句時,將使用字符1和0來取代關鍵字true和false。然后將可以在表達式中使用布爾表達式,例如:
from Cat cat where cat.alive = true
● size關鍵字用于返回一個集合的大小,例如:
● 對于有序集合,還可使用minindex與maxindex函數代表最小與最大的索引序數。同理,可以使用minelement與maxelement函數代表集合中最小與最大的元素。 例如:
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函數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)
注意這些結構變量size、elements、indices、minindex、maxindex、minelement、maxelement 等,只能在where子句中使用。
● where子句中,有序集合的元素(arrays, lists, maps)可以通過[ ]運算符訪問。例如:
//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)可以根據類或組件屬性的任何屬性進行排序,例如:
還可使用 asc或desc關鍵字指定升序或降序的排序規則,例如:
from Person as p order by p.name asc , p.age desc如果沒有指定排序規則,默認采用升序規則。即是否使用asc關鍵字是沒有區別的,加asc是升序排序,不加asc也是升序排序。
7,group by子句
返回聚集值的查詢可以對持久化類或組件屬性的屬性進行分組,分組所使用的group by子句。看下面的HQL查詢語句:
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子句用于對分組進行過濾,因此having子句只能在有group by子句時才可以使用,沒有group by子句,不能使用having子句
總結
以上是生活随笔為你收集整理的hibernate的HQL查询语言总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hibernate中的核心接口query
- 下一篇: myeclipse自动生成hiberna