posts - 495,  comments - 11,  trackbacks - 0

          4.4 條 件 查 詢(xún)

          條件查詢(xún)是更具面向?qū)ο筇厣臄?shù)據(jù)查詢(xún)方式。條件查詢(xún)可通過(guò)如下3個(gè)類(lèi)完成:

          ?? ● Criteria,代表一次查詢(xún)。

          ?? ● Criterion,代表一個(gè)查詢(xún)條件。

          ?? ● Restrictions,產(chǎn)生查詢(xún)條件的工具類(lèi)。

          執(zhí)行條件查詢(xún)的步驟如下:

          (1)獲得Hibernate的Session對(duì)象。

          (2)以Session對(duì)象創(chuàng)建Criteria對(duì)象。

          (3)增加Criterion查詢(xún)條件。

          (4)執(zhí)行Criteria的list等方法返回結(jié)果集。

          看下面的條件查詢(xún)示例:

          private void test()

          {

          ??? //獲取Hibernate Session對(duì)象

          ??? Session session = HibernateUtil.currentSession();

          ??? //開(kāi)始事務(wù)

          ??? Transaction tx = session.beginTransaction();

          ??? //創(chuàng)建Criteria和添加查詢(xún)條件同步完成

          ??? //最后調(diào)用list方法,返回查詢(xún)到的結(jié)果集

          ??? List l = session.createCriteria(Student.class)

          ??????? //此處增加限制條件必須是Student已經(jīng)存在的屬性

          ??? ??? .add( Restrictions.gt("studentNumber" , new Long(20050231) ) )

          ??????? //如果要增加對(duì)Student的關(guān)聯(lián)類(lèi)的屬性的限制則必須重新createCriteria()

          ??????? /如果此關(guān)聯(lián)屬性是集合,則只要集合里任意一個(gè)對(duì)象的屬性滿(mǎn)足下面條件

          ??????? .createCriteria("enrolments")即可

          ??????? .add( Restrictions.gt("semester" , new Short("2") ) )

          ??????? .list();

          ??????? Iterator it = l.iterator();

          ??? //遍歷查詢(xún)到的記錄

          ??? while (it.hasNext())

          ??? {

          ??????? Student s = (Student)it.next();

          ??????? System.out.println(s.getName());

          ??????? Set enrolments = s.getEnrolments();

          ??????? Iterator iter = enrolments.iterator();

          ??????? while(iter.hasNext())

          ??????? {

          ??????????? Enrolment e = (Enrolment)iter.next();

          ??????????? System.out.println(e.getCourse().getName());

          ?????? }

          ??? }

          ??? tx.commit();

          ??? ibernateUtil.closeSession();

          }

          在條件查詢(xún)中,Criteria接口代表一次查詢(xún),該查詢(xún)本身不具備任何的數(shù)據(jù)篩選功能,Session調(diào)用createCriteria(Class clazz)方法對(duì)某個(gè)持久化類(lèi)創(chuàng)建條件查詢(xún)實(shí)例。

          Criteria包含如下兩個(gè)方法:

          ?? ● Criteria setFirstResult(int firstResult),設(shè)置查詢(xún)返回的第一行記錄。

          ?? ● Criteria setMaxResults(int maxResults),設(shè)置查詢(xún)返回的記錄數(shù)。

          這兩個(gè)方法與Query的這兩個(gè)方法用法相似,都用于完成查詢(xún)分頁(yè)。

          而Criteria還包含如下常用方法:

          ?? ● Criteria add(Criterion criterion),增加查詢(xún)條件。

          ?? ● Criteria addOrder(Order order),增加排序規(guī)則。

          ?? ● List list(),返回結(jié)果集。

          Criterion接口代表一個(gè)查詢(xún)條件,該查詢(xún)條件由Restrictions負(fù)責(zé)產(chǎn)生,Restrictions是專(zhuān)門(mén)用于產(chǎn)生查詢(xún)條件的工具類(lèi),它的方法大部分都是靜態(tài)方法,常用的方法如下:

          ?? ● static Criterion allEq(Map propertyNameValues),判斷指定屬性(由Map參數(shù)的key指定)和指定值(由Map參數(shù)的value指定)是否完全相等。

          ?? ● static Criterion between(String propertyName,Object lo, Object hi),判斷屬性值在某個(gè)值范圍之內(nèi)。

          ?? ● static Criterion ilike(String propertyName, Object value),判斷屬性值匹配某個(gè)字符串。

          ?? ● static Criterion ilike(String propertyName, String value,MatchMode matchMode),判斷屬性值匹配某個(gè)字符串,并確定匹配模式。

          ?? ● static Criterion in(String propertyName,Collection values),判斷屬性值在某個(gè)集合內(nèi)。

          ?? ● static Criterion in(String propertyName,Object[] values),判斷屬性值是數(shù)組元素的其中之一。

          ?? ● static Criterion isEmpty(String propertyName),判斷屬性值是否為空。

          ?? ● static Criterion isNotEmpty(String propertyName),判斷屬性值是否不為空。

          ?? ● static Criterion isNotNull(String propertyName),判斷屬性值是否為空。

          ?? ● static Criterion isNull(String propertyName),判斷屬性值是否不為空。

          ?? ● static Criterion not(Criterion expression),對(duì)Criterion求否。

          ?? ● static Criterion sizeEq(String propertyName, int size),判斷某個(gè)屬性的元素個(gè)數(shù)是否與size相等。

          ?? ● static Criterion sqlRestriction(String sql),直接使用SQL語(yǔ)句作為篩選條件。

          ?? ● static Criterion sqlRestriction(String sql, Object[] values, Type[] types),直接使用帶參數(shù)占位符的SQL語(yǔ)句作為條件,并指定多個(gè)參數(shù)值。

          ?? ● static Criterion sqlRestriction(String sql, Object value, Type type),直接使用帶參數(shù)占位符的SQL語(yǔ)句作為條件,并指定參數(shù)值。

          Order實(shí)例代表一個(gè)排序標(biāo)準(zhǔn),Order有如下構(gòu)造器:

          Order(String propertyName, boolean ascending),根據(jù)propertyName排序,是否采用升序,如果后一個(gè)參數(shù)為true,采用升序排序,否則采用降序排序。

          如果需要使用關(guān)聯(lián)類(lèi)的屬性來(lái)增加查詢(xún)條件,則應(yīng)該對(duì)屬性再次使用createCriteria方法。看如下示例:

          session.createCriteria(Person.class)

          ??? .add(Restrictions.like("name" , "dd%"))

          ??? .createCriteria("addresses")

          ??? .add(Restrictions.like("addressdetail" , "上海%"))

          ??? .list();

          上面的代碼表示建立Person類(lèi)的條件查詢(xún),第一個(gè)查詢(xún)條件是直接過(guò)濾Person的屬性,即選出name屬性以dd開(kāi)始的Person實(shí)例,第二個(gè)查詢(xún)條件則過(guò)濾Person關(guān)聯(lián)實(shí)例的屬性,其中addresses是Person類(lèi)的關(guān)聯(lián)持久化類(lèi)Address,而addressdetail則是Address類(lèi)的屬性。值得注意的是,查詢(xún)并不是查詢(xún)Address持久化類(lèi),而是查詢(xún)Person持久化類(lèi)。

          注意:使用關(guān)聯(lián)類(lèi)的條件查詢(xún),依然是查詢(xún)?cè)谐志没?lèi)的實(shí)例,而不是查詢(xún)被關(guān)聯(lián)類(lèi)的實(shí)例。

          posted on 2009-07-19 08:59 jadmin 閱讀(149) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 荃湾区| 德阳市| 内江市| 海安县| 博野县| 如皋市| 辽源市| 福贡县| 随州市| 安多县| 隆子县| 平罗县| 图们市| 双鸭山市| 太谷县| 车致| 林周县| 孝昌县| 太原市| 江川县| 常宁市| 宝应县| 英吉沙县| 湘乡市| 乌兰察布市| 商都县| 达州市| 永吉县| 武穴市| 比如县| 武乡县| 龙海市| 中方县| 剑川县| 车致| 木里| 潜山县| 分宜县| 宁都县| 绥滨县| 浮梁县|