Hibernate讀書筆記—–條件查詢 – JAVA編程語言程序開發技術文章

條件查詢一般是通過以下三個類完成的:
             1、Criteria:代表一次查詢
             2、Criterion:代表一個查詢條件
             3、Restriction:代表查詢條件的工具類
          執行條件查詢的步驟如下:
             1、獲得Hibernate的Session對象
             2、以Session對象創建Criteria對象
             3、使用Restriction的靜態方法創建Criterion查詢條件
             4、向Criteria查詢中添加Criterion查詢條件
             5、執行Criterion的list()方法或者uniqueResult()方法返回結果集
          示例:
[java] 
public void query(){ 
    Session session = HibernateUtil.getSession(); 
    Transaction tx = session.beginTransaction(); 
    //使用ctiteria進行條件查詢 
    List list = session.createCriteria(Person.class) 
                   .add(Restrictions.eq("id", 1)) 
                   .list(); 
    for (Iterator iterator = list.iterator();iterator.hasNext();) { 
        Person person = (Person) iterator.next(); 
        System.out.println(person.getName()); 
    } 

          Criteria對象本身並不具備任何數據過濾篩選功能,但程序可以通過向Criteria對象中組合多個Criterion(每一個Criterion對象代表瞭一個數據過濾條件)即可實現數據過濾。
          Criteria包含如下兩個方法:
          setFristResult(int firstResult):設置查詢返回的第一行記錄
          setMaxResult(int maxResult):設置查詢返回的記錄數
          這兩個方法用於查詢分頁
          Criteria還包含如下幾個常用的方法:
             add(Criterion criterion):增加查詢條件
             addOrder(Order order):增加排序規則
[java] 
List list = session.createCriteria(Person.class) 
            .add(Restrictions.like("name", "李%"))        //增加查詢條件 
            .addOrder(Order.desc("name"))                 //結果集排序 
            .setMaxResults(50)                            //返回的記錄數最多為50條 
            .list();                                     //返回結果集 
          Criterion接口代表瞭一個查詢條件,該查詢條件有Restrictions負責產生。Restrictions是專門用於產生查詢條件的工具類,它的方法大部分是靜態方法。
        
          一、關聯
          如果需要使用關聯實體的屬性來增加查詢條件,則應該對該屬性再次使用createCriteria方法。
[java] 
List list = session.createCriteria(Person.class) 
            .createAlias("myEvent", "e") 
            .add(Restrictions.like("e.title", "工業大學%")) 
            .list(); 
          第二個createCriteria返回一個新的Criteria實例,該實例引用Person類中的myEvent關聯屬性。title是MyEvent類中的屬性。
接下來,替換形態在某些情況下也是很有用的。
[java] 
List list = session.createCriteria(Person.class) 
            .add(Restrictions.like("name", "李%")) 
            .setFetchMode("myEvent", FetchMode.JOIN) 
            .list(); 
          createAlias()方法並不創建一個新的Criteria實例,它隻是給關聯實體起一個別名,讓後面的過濾條件可根據該關聯實體進行篩選。
        
          二、動態關聯
          在默認情況下,條件查詢將根據映射文件指定的延遲加載策略來加載關聯實體,如果希望在條件查詢中改變延遲加載策略,可以通過setFetchMode()方法來控制。setFetchMode()方法接受一個FetchMode參數。
          DEFAULT:使用配置文件指定的延遲加載策略處理
          JOIN:使用外連接、預初始化所有關聯實體
          SELECT:啟用延遲加載,系統將使用單獨的select語句來初始化關聯實體。隻有當真正訪問關聯實體的時候,才會執行第二條select語句。
。。。。。。。。。。。。。。。。。。。。。。。。。。。
          使用外連接方式抓取Myevent。
 
          三、投影、聚合、分組
         Hibernate的條件過濾中使用Projection代表投影運算,Projection是一個接口,而Projections作為Projection的工廠,負責生成Projection對象。
          一旦產生瞭Projection對象之後,就可以通過setProjection(Projection projection)方法來進行投影運算瞭。
[java] 
List list = session.createCriteria(Person.class) 
            .setProjection(Projections.projectionList() 
            .add( Projections.avg("age")) 
            .add(Projections.groupProperty("name"))) 
            .list(); 
          在一個條件查詢中沒有必要顯式的使用 "group by" 。某些投影類型就是被定義為分組投影,他們也出現在SQL的group by子句中。
          如果我們希望對分組後屬性進行排序,那就需要為投影運算指定一個別名瞭,有兩種方法可以為投影運算指定別名     
         1、使用alias()方法
[java] 
List list = session.createCriteria(Person.class) 
       .setProjection(Projections.alias(Projections.groupProperty("name"), "name")) 
       .addOrder(Order.asc("age")) 
       .list(); 

         2、使用as()方法為自身指定別名
[java]
List list = session.createCriteria(Person.class) 
            .setProjection(Projections.groupProperty("name").as("name")) 
            .addOrder(Order.asc("age")) 
            .list(); 
          也可以使用Property.forName()來表示投影:
[java]        www.aiwalls.com
List list = session.createCriteria(Person.class) 
       .setProjection(Projections.projectionList() 
       .add(Property.forName("name"))) 
       .list(); 
 
          四、離線查詢和子查詢
          條件查詢的離線查詢有DetachedCriteria來代表,DetachedCriteria類允許在一個session范圍外創建一個 查詢,並且可以使用任意Session來執行它。
[java] 
public void detachedCriteriaTest(){ 
    //定義一個離線查詢 
    DetachedCriteria query = DetachedCriteria.forClass(Person.class).setProjection(Property.forName("name")); 
    Session session = HibernateUtil.getSession(); 
    Transaction tx = session.beginTransaction(); 
    //執行離線查詢 
    List list = query.getExecutableCriteria(session).list(); 
     
    for (Iterator iterator = list.iterator();iterator.hasNext();) { 
        Person person = (Person) iterator.next(); 
        System.out.println(person.getName()); 
    } 

          另外DetachedCriteria還可以代表子查詢,當我們把DetachedCriteria傳入Criteria中作為查詢條件時,DetachedCriteria就變成瞭子查詢。
[java]
public void subQuery(){ 
    //定義一個離線查詢 
    DetachedCriteria query = DetachedCriteria.forClass(Person.class).setProjection(Property.forName("name")); 
    Session session = HibernateUtil.getSession(); 
    Transaction tx = session.beginTransaction(); 
    //執行子查詢 
    List list = session.createCriteria(Person.class) 
                .add(Property.forName("name").in(query)) 
                .list(); 
    for (Iterator iterator = list.iterator();iterator.hasNext();) { 
        Person person = (Person) iterator.next(); 
        System.out.println(person.getName()); 
    } 

 

作者:chenssy

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。