posts - 0, comments - 77, trackbacks - 0, articles - 356
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Criteria Query

          Posted on 2007-08-08 23:00 semovy 閱讀(505) 評(píng)論(0)  編輯  收藏 所屬分類: Hibernate

          Criteria Query

          Criteria Query通過(guò)面向?qū)ο蠡脑O(shè)計(jì),將數(shù)據(jù)查詢條件封裝為一個(gè)對(duì)象。簡(jiǎn)單來(lái)

          講,Criteria Query可以看作是傳統(tǒng)SQL的對(duì)象化表示,如:

          Criteria criteria = session.createCriteria(User.class);

          criteria.add(Expression.eq("name","Erica"));

          criteria.add(Expression.eq("sex",new Integer(1)));

          這里的criteria 實(shí)例實(shí)際上是SQL Select * from t_user where

          name=Ericaand sex=1的封裝(我們可以打開Hibernate show_sql 選項(xiàng),

          以觀察Hibernate在運(yùn)行期生成的SQL語(yǔ)句)。

          Hibernate 在運(yùn)行期會(huì)根據(jù)Criteria 中指定的查詢條件(也就是上面代碼中通過(guò)

          criteria.add方法添加的查詢表達(dá)式)生成相應(yīng)的SQL語(yǔ)句。

          這種方式的特點(diǎn)是比較符合Java 程序員的編碼習(xí)慣,并且具備清晰的可讀性。正因

          為此,不少ORM實(shí)現(xiàn)中都提供了類似的實(shí)現(xiàn)機(jī)制(如Apache OJB)。

          對(duì)于Hibernate的初學(xué)者,特別是對(duì)SQL了解有限的程序員而言,Criteria Query

          無(wú)疑是上手的極佳途徑,相對(duì)HQLCriteria Query提供了更易于理解的查詢手段,借

          IDECoding Assist機(jī)制,Criteria的使用幾乎不用太多的學(xué)習(xí)。

          Criteria 查詢表達(dá)式

          Criteria 本身只是一個(gè)查詢?nèi)萜鳎唧w的查詢條件需要通過(guò)Criteria.add

          方法添加到Criteria實(shí)例中。

          如前例所示,Expression 對(duì)象具體描述了查詢條件。針對(duì)SQL 語(yǔ)法,

          Expression提供了對(duì)應(yīng)的查詢限定機(jī)制,包括:

          方法 描述

          Expression.eq 對(duì)應(yīng)SQLfield = value”表達(dá)式。

          Expression.eq("name","Erica")

          Expression.allEq 參數(shù)為一個(gè)Map對(duì)象,其中包含了多個(gè)屬性-值對(duì)

          應(yīng)關(guān)系。相當(dāng)于多個(gè)Expression.eq關(guān)系的疊加。

          Expression.gt 對(duì)應(yīng)SQL中的 “field > value ” 表達(dá)式

          Hibernate Developer’s Guide Version 1.0

          September 2, 2004 So many open source projects. Why not Open your Documents?

          Expression.ge 對(duì)應(yīng)SQL中的 “field >= value” 表達(dá)式

          Expression.lt 對(duì)應(yīng)SQL中的 “field < value” 表達(dá)式

          Expression.le 對(duì)應(yīng)SQL中的 “field <= value” 表達(dá)式

          Expression.between 對(duì)應(yīng)SQL中的 “between” 表達(dá)式

          如下面的表達(dá)式表示年齡(age)位于1350區(qū)

          間內(nèi)。

          Expression.between("age",new

          Integer(13),new Integer(50));

          表達(dá)式

          Expression.in 對(duì)應(yīng)SQL中的 ”field in …” 表達(dá)式

          Expression.eqProperty 用于比較兩個(gè)屬性之間的值,對(duì)應(yīng)SQL中的“field

          = field”。

          如:

          Expression.eqProperty(

          "TUser.groupID",

          "TGroup.id"

          );

          Expression.gtProperty 用于比較兩個(gè)屬性之間的值,對(duì)應(yīng)SQL中的“field

          > field”。

          Expression.geProperty 用于比較兩個(gè)屬性之間的值,對(duì)應(yīng)SQL中的“field

          >= field”。

          Expression.ltProperty 用于比較兩個(gè)屬性之間的值,對(duì)應(yīng)SQL中的“field

          < field”。

          Expression.leProperty 用于比較兩個(gè)屬性之間的值,對(duì)應(yīng)SQL中的“field

          <= field”。

          Expression.and and關(guān)系組合。

          如:

          Expression.and(

          Expression.eq("name","Erica"),

          Expression.eq(

          "sex",

          new Integer(1)

          )

          );

          Expression.or or關(guān)系組合。

          如:

          Hibernate Developer’s Guide Version 1.0

          September 2, 2004 So many open source projects. Why not Open your Documents?

          Expression.or(

          Expression.eq("name","Erica"),

          Expression.eq("name","Emma")

          );

          Expression.sql 作為補(bǔ)充,本方法提供了原生SQL語(yǔ)法的支持。我

          們可以通過(guò)這個(gè)方法直接通過(guò)SQL語(yǔ)句限定查詢

          條件。

          下面的代碼返回所有名稱以“Erica”起始的記錄:

          Expression.sql(

          lower({alias}.name) like lower(?),

          "Erica%",

          Hibernate.STRING

          );

          其中的“{alias}”將由Hibernate在運(yùn)行期使

          用當(dāng)前關(guān)聯(lián)的POJO別名替換。

          注意Expression 各方法中的屬性名參數(shù)(如Express.eq中的第一個(gè)參數(shù)),這里

          所謂屬性名是POJO中對(duì)應(yīng)實(shí)際庫(kù)表字段的屬性名(大小寫敏感),而非庫(kù)表中的實(shí)

          際字段名稱。

          Criteria 高級(jí)特性

          限定返回的記錄范圍

          通過(guò)criteria. setFirstResult/setMaxResults 方法可以限制一次查詢返回

          的記錄范圍:

          Criteria criteria = session.createCriteria(TUser.class);

          //限定查詢返回檢索結(jié)果中,從第一百條結(jié)果開始的20條記錄

          criteria.setFirstResult(100);

          criteria.setMaxResults(20);

          對(duì)查詢結(jié)果進(jìn)行排序

          //查詢所有groupId=2的記錄

          //并分別按照姓名(順序)groupId(逆序)排序

          Criteria criteria = session.createCriteria(TUser.class);

          criteria.add(Expression.eq("groupId",new Integer(2)));

          criteria.addOrder(Order.asc("name"));

          Hibernate Developer’s Guide Version 1.0

          September 2, 2004 So many open source projects. Why not Open your Documents?

          criteria.addOrder(Order.desc("groupId"));

          Criteria作為一種對(duì)象化的查詢封裝模式,不過(guò)由于Hibernate在實(shí)現(xiàn)過(guò)程中將精力

          更加集中在HQL查詢語(yǔ)言上,因此Criteria的功能實(shí)現(xiàn)還沒做到盡善盡美(這點(diǎn)上,OJB

          Criteria 實(shí)現(xiàn)倒是值得借鑒),因此,在實(shí)際開發(fā)中,建議還是采用Hibernate

          方推薦的查詢封裝模式:HQL。

          主站蜘蛛池模板: 治多县| 巨鹿县| 紫阳县| 杭锦旗| 基隆市| 云南省| 三台县| 新邵县| 宜阳县| 宜君县| 原平市| 衡东县| 常宁市| 红安县| 石河子市| 新建县| 黑山县| 句容市| 襄汾县| 酒泉市| 温宿县| 马公市| 金阳县| 安徽省| 和田县| 宁化县| 桓仁| 余干县| 海原县| 金川县| 正定县| 随州市| 尼木县| 扶余县| 玛沁县| 道真| 保定市| 四平市| 大安市| 庆安县| 九江县|