隨筆-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
          主站蜘蛛池模板: 全州县| 昭苏县| 高雄市| 上思县| 青州市| 正镶白旗| 墨脱县| 桐乡市| 甘谷县| 莱西市| 临沧市| 阿图什市| 虎林市| 建德市| 南召县| 会昌县| 台州市| 阜平县| 丰台区| 博湖县| 江源县| 灵璧县| 丹阳市| 和平区| 凤山县| 吉林市| 灵台县| 乐安县| 区。| 东阳市| 永兴县| 南京市| 双城市| 册亨县| 盘山县| 同江市| 田阳县| 从化市| 贵港市| 阳新县| 巴中市|