Hibernate Query數據查詢

主要由三種查詢:HQL查詢、Criteria條件查詢、SQL查詢。java

如下分別講解sql

1. HQL查詢數據庫

HQL(Hibernate Query Language)查詢提供了更加豐富和靈活的查詢特性,所以Hibernate將HQL查詢立爲官方推薦的標準查詢方式。express

HQL語法與SQL類似,但HQL是一種面向對象的查詢語言,操做的是類、實例和屬性等。數組

HQL是徹底面向對象的查詢語言,支持繼承和多態等特性。session

HQL查詢步驟函數

(1) 得到Hibernate Session對象工具

(2) 設計HQL查詢語句fetch

(3) 以HQL查詢語句做爲參數,調用Session.createQuery(hql)方法建立查詢對象ui

(4) 若是HQL查詢語句包含參數,調用Query的setXxxx()方法爲參數賦值

(5) 調用Query對象的list等方法遍歷查詢結果

public class HqlQueryTest{  private void findStudents(){
    SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
    Session session = sessionFactory.openSession();
    Transaction trans = session.beginTransaction();
    Query query = session.createQuery("FROM Student as stu WHERE stu.studentid=:sid");
    query.setString("sid", "123456");
    List list = query.list();for...
    trans.commit();
    session.close();
    sessionFactory.close();
  }
}

Query接口提供了綁定各類Hibernate映射類型的方法,

如:setBinary()/setString()/setBoolean()/setByte()/setCalendar()/setCharacter()/setDate()/setDouble()/setText()/setTime()/setTimestamp()。

還包含了兩個用於實現Hibernate分頁的方法:

① setFirstResult(int firstResult):設置返回的結果集從第幾條記錄開始;

② setMaxResults(int maxResults):設置本次查詢返回的結果數;

HQL語法分析

HQL語句自己不區分大小寫,但HQL中使用的包名、類型、實例名及屬性名都區分大小寫。

(1) FROM子句

from Student as st

該子句返回Student持久化類的全部實例,一般推薦起別名;

(2) SELECT子句

select子句選擇將哪些對象與屬性返回到查詢結果集中,固然選擇的屬性必須是from後持久化類包含的屬性。如:

SELECT st.name FROM Student as st

select能夠選擇任意屬性,不只能夠選擇持久化類的直接屬性,還能夠選擇引用屬性包含的屬性(關聯內容)。如:

SELECT st.class FROM Student as st

(3) 彙集函數

HQL查詢甚至能夠返回做用與屬性之上的彙集函數的計算結果,HQL支持的彙集函數與SQL徹底相同。有5種:

① avg:計算屬性平均值;

② count:統計選擇對象的數量;

③ max:統計屬性值的最大值;

④ min:統計屬性值的最小值;

⑤ sum:計算屬性值的總和;

如:

SELECT count(*) FROM Student

SELECT max(st.age) FROM Student as st

(4) 多態查詢

HQL語句被設計成能理解多態查詢,Hibernate能夠在from子句中指定任何Java類或接口,其from後跟的持久化類名不只會查詢出該持久化類的所有實力,還會查詢出該類中子類的所有實例。

如:FROM Student as st    //該查詢語句不只會查詢出Student的所有實例,還會查詢出Student的子類

(5) WHERE子句

where子句用於篩選選中的結果,以縮小選擇的範圍。

如: FROM Student as st WHERE st.name LIKE 「張%」

where子句中的屬性表達式必須以基本類型或java.lang.String結尾,不要使用引用類型屬性結尾。

如Student有class屬性,class有classname屬性:

FROM Student as st WHERE st.class.Classname LIKE 「td%」  //正確

FROM Student as st WHERE st.class LIKE 「td%」                   //不正確

(6) 表達式

HQL的表達式很是多,其where子句後支持的運算符也不少,不只包括SQL的運算符,也包括EJB-QL的運算符等。

在where子句中容許使用的表達式包括大多數能夠在SQL中使用的表達式。

· 數學運算符: + 、-、*、/  等

· 二進制比較運算符: =、<=、>=、<>、!=、like 等

· 邏輯運算符:and、or、not 等

· 判斷字:in、not in、between、is null、is not null、is empty、is not empty、memberof、not memberof 等

· 條件判斷:case、case…when…then…else…end 等

· 字符串鏈接符:value1 || value2或使用函數 concat(value1, value2)

· 時間操做函數:currentDate、currentTime、currentTimestamp、second、minute、hour、day、month、year 等

· HQL還支持EJB-QL3.0所支持的函數或操做substring、trim、lower、upper、Length、locate、abs、sqrt、bit_length和nullif 等

· 支持數據庫的類型轉換函數,如cast(…as….),第二個參數是Hibernate的類型名,或者extract(…from…),前提是底層數據庫支持ANSI cast和extract

· 若是底層數據庫支持單行函數sign、trunk、rtrim()、sin,則HQL語句也能夠徹底支持

· HQL語句支持使用「?」做爲參數佔位符,這與JDBC的參數佔位符一致,也可使用命名參數展位符號,方法是在參數名前加冒號「:」,如 :username、:xxx等

· 可在where子句中使用SQL常量,如「tfnew21」、6六、」2009-04-21」等

· 還能夠在HQL語句中使用Java public static final常量,如CC.Color.TABBY

在這些結構變量中:size、elements、ndices、minindex、maxindex、minelement、maxelement等只能在where子句中使用。

where子句中,有序集合的元素(arrays、lists、maps)能夠經過「[]」運算符訪問。用法以下:

FROM Student as st where st.class[0].classname is not null

group by子句返回彙集值(Aggregate Values)的查詢能夠按照一個返回的類或組件(Components)中的任何屬性(Property)進行分組,能夠對持久化類或引用屬性的屬性進行分組,分組時可以使用group by子句。以下:

SELECT st.age, count(st.name) FROM Student as st GROUP BY st.age

相似於SQL的規則,出如今select後的屬性要麼出如今彙集函數中,要麼出如今group by的屬性列表中。

having子句用於對分組進行過濾,having子句只能在有group by子句時纔可使用。如:

SELECT st.age, count(st.name) FROM Student as st GROUP BY st.age HAVING st.age BETWEEN 21 AND 25;

根據查詢返回的列表(list),能夠按照一個返回的類或組件中的任何屬性用order by子句進行排序

可使用ASC(升序)、DESC(降序)指定排序規則,沒有指定則默認採用升序規則。如:

FROM Student as st ORDER BY st.age DESC

group by和order by子句中都不能包含算數表達式

對於集合屬性,Hibernate默認採用延遲加載策略

例如,對於持久化類Student,有集合屬性class,加載Student實例時,默認不加載class屬性。若是Session被關閉,則Student實例將沒法訪問關聯的class屬性。

爲了解決該問題,能夠在Hibernate映射文件中取消延遲加載,或者使用fetch jion。如:

FROM Student as st FETCH JOIN st.class&#160;&#160;&#160; //此處的fetch語句將會初始化Student的class集合屬性

若是使用了屬性級別的延遲加載,能夠用fetch all properties來強制Hibernate當即獲取那些本來須要延遲加載的屬性。如:

FROM Student FETCH ALL PROPERTIES WHERE age>12 ORDER BY age

HQL查詢還支持查詢所用的HQL語句放入配置文件中,而不是代碼中。經過這種方式,能夠大大提升程序設計的靈活度。以下:

<query name="getStudent」>

&#160; FROM Student FETCH ALL PROPERTIES WHERE age>? ORDER BY age

</query>

在程序中調用命名查詢的方法爲:

Query query = session.getNamedQuery(「getStudent」);

query.setInteger(0, 21);

&#160;

2. Creteria條件查詢

條件查詢是更具面向對象特點的數據查詢方式,經過如下三個類完成:

· Creteria:表明一次查詢

· Criterion:表明一個查詢條件

· Restrictions:產生查詢條件的工具類

執行條件查詢的步驟:

(1) 得到Hibernate的Session對象

(2) 以Session對象建立Criteria對象

(3) 增長Criterion查詢條件

(4) 執行Criteria的list等方法返回結果集

如:

//增長的限制條件必須是Student已經存在的屬性

Criteria cri = session.createCriteria(Student.class);

cri.add(Restrictions.gt(「studentid」, new Integer(123)));

List list = cri.list();

在條件查詢中,Criteria接口表明一次查詢,該查詢自己不具有任何的數據篩選功能。

調用createCriteria(Class class)方法對某個持久化類建立條件查詢實例。

Criteria經常使用方法

Criteria add(Criterion criterion):增長查詢條件;

Criteria addOrder(Order order):增長排序規則;

List list():返回結果集;

分頁查詢用的兩個方法

Criteria setFirstResult(int firstResult):設置查詢返回的第一行記錄;

Criteria setMaxResult(int maxResult):設置查詢返回的記錄數;

Criterion接口表明一個查詢條件,該查詢條件由Restrictions負責產生,而Restrictions是專門用於產生查詢條件的工具類,它的方法大部分都是靜態方法。

經常使用的方法有以下幾種:

static Criterion allEq(Map propertyNameValues):判斷指定屬性(由Map參數的key指定)和指定值(由Map參數的value指定)是否徹底相等;

static Criterion between(String propertyName, Object obj1, Object obj2):判斷屬性值是否在某個值範圍以內;

static Criterion ilike(String propertyName, Object value):判斷屬性值是否匹配某個字符串;

static Criterion ilike(String propertyName, String value, MatchMode matchMode):判斷屬性值是否匹配某個字符串,並肯定匹配模式;

static Criterion in(String propertyName, Collection values):判斷屬性值是否在某個集合內;

static Criterion in(String propertyName, Object[] values):判斷屬性值是否數組元素的其中之一;

static Criterion isEmpty(String propertyName):判斷屬性值是否爲空;

static Criterion isNotEmpty(String propertyName):判斷屬性值是否不爲空;

static Criterion isNull(String propertyName):判斷屬性值是否不爲空;

static Criterion isNotNull(String propertyName):判斷屬性值是否不爲空;

static Criterion not(Criterion expression):對Criterion求否;

static Criterion sizeEq(String propertyName, int size):判斷某個屬性的元素個數是否與size相等;

static Criterion sqlRestriction(String sql):直接使用SQL語句做爲篩選條件;

static Criterion sqlRestriction(String sql, Object value, Type type):直接使用帶參數佔位符的SQL語句做爲條件,並指定參數值;

static Criterion sqlRestriction(String sql, Object[] value, Type[] type):直接使用帶參數佔位符的SQL語句做爲條件,並指定多個參數值;

若是須要使用關聯類的屬性來增長查詢條件,則應該對屬性再次使用createCriteria方法,用法以下:

session.cerateCriteria(Student.class)

&#160; .add(Restriction.like(「name」, 「天風」)).createCriteria(「classes」).add(Restriction.like(「className」, 「班級名」)).list();

注意:查詢並非查詢class持久化類,而是查詢Student持久化類。

&#160;

3. SQL查詢

Hibernate還支持使用SQL查詢,使用SQL查詢能夠利用某些數據庫的特性,或者用於將原有的JDBC應用移植到Hibernate應用上。

SQL查詢是經過SQLQuery接口來表示的,因爲SQLQuery接口是Query接口的子接口,所以徹底能夠調用Query接口的方法。

執行SQL查詢的步驟以下:

(1) 獲取Hibernate Session對象;

(2) 編寫SQL語句;

(3) 以SQL語句做爲參數,調用Session的createSQLQuery方法建立查詢對象;

(4) 若是SQL語句包含參數,則調用Query的setXxx方法爲參數賦值;

(5) 調用SQLQuery對象的addEntity或addScale方法將選出的結果與實體關聯;

(6) 調用Query的list方法返回查詢的結果集

使用以下:

List list = session.createSQLQuery(「SELECT {st.*} FROM student as st 」).addEntity(「st」, Student.class).list();

若是不使用{st.*}形式,就可以讓實體別名與表別名互不相同,關聯實體的類型時,被關聯的類必須有對應的setter方法。

相關文章
相關標籤/搜索