posts - 495,  comments - 11,  trackbacks - 0

          4.4 條 件 查 詢

          條件查詢是更具面向對象特色的數據查詢方式。條件查詢可通過如下3個類完成:

          ?? ● Criteria,代表一次查詢。

          ?? ● Criterion,代表一個查詢條件。

          ?? ● Restrictions,產生查詢條件的工具類。

          執行條件查詢的步驟如下:

          (1)獲得Hibernate的Session對象。

          (2)以Session對象創建Criteria對象。

          (3)增加Criterion查詢條件。

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

          看下面的條件查詢示例:

          private void test()

          {

          ??? //獲取Hibernate Session對象

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

          ??? //開始事務

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

          ??? //創建Criteria和添加查詢條件同步完成

          ??? //最后調用list方法,返回查詢到的結果集

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

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

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

          ??????? //如果要增加對Student的關聯類的屬性的限制則必須重新createCriteria()

          ??????? /如果此關聯屬性是集合,則只要集合里任意一個對象的屬性滿足下面條件

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

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

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

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

          ??? //遍歷查詢到的記錄

          ??? 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();

          }

          在條件查詢中,Criteria接口代表一次查詢,該查詢本身不具備任何的數據篩選功能,Session調用createCriteria(Class clazz)方法對某個持久化類創建條件查詢實例。

          Criteria包含如下兩個方法:

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

          ?? ● Criteria setMaxResults(int maxResults),設置查詢返回的記錄數。

          這兩個方法與Query的這兩個方法用法相似,都用于完成查詢分頁。

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

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

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

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

          Criterion接口代表一個查詢條件,該查詢條件由Restrictions負責產生,Restrictions是專門用于產生查詢條件的工具類,它的方法大部分都是靜態方法,常用的方法如下:

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

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

          ?? ● 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 isNotNull(String propertyName),判斷屬性值是否為空。

          ?? ● static Criterion isNull(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[] values, Type[] types),直接使用帶參數占位符的SQL語句作為條件,并指定多個參數值。

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

          Order實例代表一個排序標準,Order有如下構造器:

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

          如果需要使用關聯類的屬性來增加查詢條件,則應該對屬性再次使用createCriteria方法??慈缦率纠?/p>

          session.createCriteria(Person.class)

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

          ??? .createCriteria("addresses")

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

          ??? .list();

          上面的代碼表示建立Person類的條件查詢,第一個查詢條件是直接過濾Person的屬性,即選出name屬性以dd開始的Person實例,第二個查詢條件則過濾Person關聯實例的屬性,其中addresses是Person類的關聯持久化類Address,而addressdetail則是Address類的屬性。值得注意的是,查詢并不是查詢Address持久化類,而是查詢Person持久化類。

          注意:使用關聯類的條件查詢,依然是查詢原有持久化類的實例,而不是查詢被關聯類的實例。

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

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 新河县| 广安市| 古交市| 武夷山市| 莲花县| 邻水| 滕州市| 修文县| 贞丰县| 馆陶县| 通许县| 米泉市| 潞城市| 鄂州市| 延长县| 滦平县| 定日县| 延安市| 峡江县| 马公市| 金阳县| 保山市| 广水市| 喜德县| 从江县| 临朐县| 乐亭县| 丰都县| 古田县| 贡山| 大荔县| 清苑县| 招远市| 牟定县| 盘山县| 全南县| 深圳市| 永仁县| 皋兰县| 云林县| 额济纳旗|