隨筆-61  評論-159  文章-0  trackbacks-0

          hibernate查詢語言hql

          在hql中關鍵字不區分大小寫,但是屬性和類名區分大小寫

          1、簡單屬性查詢
          1>如果對單一屬性進行查詢,返回結果集屬性列表,元素類型和實體類中相應的屬性類型一致
           

          例子:

          1List students = session.createQuery("select name from Student").list();
          2            for (Iterator iter=students.iterator(); iter.hasNext();) {
          3                String name = (String)iter.next();
          4                System.out.println("student.name="+name);
          5            }

          由于第1行中的name是String字符串類型,所以第三行對應的也要是字符串類型。其他的字段也要保持一致。

          2>如果是對多個屬性進行查詢,返回的是Object數組類型,所以其元素類型也要與相對應的屬性類型保持一致。

          例子:

          1List students = session.createQuery("select id,name from Student").list();
          2   for (Iterator iter=students.iterator(); iter.hasNext();) {
          3    Object[] o = (Object[])iter.next();
          4    System.out.println(o[0]+","+o[1]);
          5   }


          PS:如果想返回的類型與原來的對象類型保持一致的話,就例子而言就是Student類型,首先先包住Student的POJO類中有Student的兩個id,name參數的構造方法。

          1List students = session.createQuery("select new Student(id,name) from Student").list();
          2            for (Iterator iter=students.iterator(); iter.hasNext();) {
          3                Student s = (Student)iter.next();
          4                System.out.println(s.getId()+","+s.getName());
          5            }

          注:第一行中的new Student(id,name)很重要,決定返回是Student類型,這樣更對象化,其他第3行也一致。

          2、實體查詢
          實體查詢中,涉及到對對象的查詢,對于多個記錄,就一般用Querry接口里面的list()和iterate()方法來迭代。
          兩種方法的區別是:
                                            一、list(),對條件符合的數據全部一次加載,只發出一條語句。
                                            二、iterate(),先把符合條件的id全部查詢出來,然后,再根據里面id數量,發出相應的sql語句,就是有N條記錄就查詢N+1次。
          PS:相對而已,lsit()加載了直接放在一級緩存里面,就是Session里面,從來不使用Session
                                      iterate()一開始加載,先從一級緩存里面加載,如果有就只查詢一次,如果沒有就先把符合條件的id全部查詢出來,然后,再根據里面id數量,發出相應的sql語句,就是有N條記錄就查詢N+1次。
          例子:

          1List students = session.createQuery("from Student as s").list();
          2            for (Iterator iter=students.iterator(); iter.hasNext();) {
          3                Student s = (Student)iter.next();
          4                System.out.println("student.name="+s.getName());
          5            }

          注:只發出一條語句。

          1Iterator students = session.createQuery("from Student").iterate();
          2            while(students.hasNext())
          3            {
          4                Student s = (Student)students.next();
          5                System.out.println("s.name="+s.getName());
          6                
          7            }

          注:發出N+1條語句,因為一級緩存里面沒有相應的記錄。

           1List students = session.createQuery("from Student").list();
           2                for (Iterator iter=students.iterator(); iter.hasNext();) {
           3                    Student s = (Student)iter.next();
           4                    System.out.println("student.name="+s.getName());
           5                }

           6                System.out.println("---------------------------------------------------");
           7                Iterator it = session.createQuery("from Student").iterate();
           8                while(it.hasNext())
           9                {
          10                    Student s = (Student)it.next();
          11                    System.out.println("s.name="+s.getName());
          12                    
          13                }

          注:只發出兩條查詢語句,因為list()已經把數據存在一級緩存里面,對應iterate()先從一級緩存里面查找,所以總共只發出兩條查詢語句。




          -------------------------------------------------------------------------------------------------
          PS:本博客文章,如果沒有注明是有“轉”字樣,屬于本人原創。如果需要轉載,務必注明作者文章的詳細出處地址,否則不允許轉載,多謝合作!
          posted on 2008-10-28 23:56 apple0668 閱讀(818) 評論(0)  編輯  收藏 所屬分類: hibernate
          主站蜘蛛池模板: 邮箱| 新竹市| 青河县| 平凉市| 上思县| 德清县| 会同县| 广宗县| 无为县| 南汇区| 常熟市| 北票市| 巨野县| 焦作市| 永丰县| 库伦旗| 翼城县| 香港| 历史| 顺平县| 宾川县| 新田县| 枣阳市| 连山| 彭州市| 余干县| 尼玛县| 嵊州市| 新津县| 朝阳县| 茂名市| 车险| 通州市| 贞丰县| 山西省| 安远县| 攀枝花市| 油尖旺区| 霍州市| 乾安县| 忻州市|