隨筆-124  評論-49  文章-56  trackbacks-0
          在hql中關(guān)鍵字不區(qū)分大小寫,但是屬性和類名區(qū)分大不寫

          簡單屬性查詢[重要]
          1  單一屬性查詢,返回結(jié)果集屬性列表,元素類型和實(shí)體類中相應(yīng)的屬性類型一致
           List students=session.createQuery("select name from Student").list();
                      
          for(Iterator iter=students.iterator();iter.hasNext();){
                          String name
          =(String)iter.next();
                          System.out.println(name);
                    }
          2  多個(gè)屬性查詢,返回的集合元素是對象數(shù)組
            數(shù)組元素的類型和對應(yīng)的屬性在實(shí)體類中的類型一致
            數(shù)組的長度取決于select中屬性的個(gè)數(shù)

           List students=session.createQuery("select id, name from Student").list();
                      
          for(Iterator iter=students.iterator();iter.hasNext();){
                          Object[] obj
          =(Object[])iter.next();
                          System.out.println(obj[
          0]+":"+obj[1]);
                      }
          3  對象化查詢,可以采用hql動態(tài)實(shí)例化Student對象,此時(shí)list中為Student對象集合
             注意,必須有在實(shí)體類中有相應(yīng)的構(gòu)造方法
          List students=session.createQuery("select new Student(id, name) from Student").list();
                      
          for(Iterator iter=students.iterator();iter.hasNext();){
                          Student stu
          =(Student)iter.next();
                          System.out.println(stu.getId()
          +":"+stu.getName());
                      }
          4  別名查詢,可以使用as命名別名
           List students=session.createQuery("select s.id, s.name from Student as s").list();
                      
          for(Iterator iter=students.iterator();iter.hasNext();){
                          Object[] obj
          =(Object[])iter.next();
                          System.out.println(obj[
          0]+":"+obj[1]);
                      }
          5 實(shí)體屬性
            setEntity();



          實(shí)體對象查詢[重要]


          1 忽略select,返回Student對象的集合,可以忽略select
          List students=session.createQuery("from Student").list();
                      
          for(Iterator iter=students.iterator();iter.hasNext();){
                          Student stu
          =(Student)iter.next();
                          System.out.println(stu.getName()
          +":"+stu.getCreateTime());
                      }
          2 使用別名,返回Student對象的集合,可以使用別名,兩種方式都支持:空格或as
          List students=session.createQuery("from Student s").list();
            List students
          =session.createQuery("from Student as s").list();
            
          for(.){.}
          3 使用select,返回Student對象的集合,使用select用,必須使用別名
          List students=session.createQuery("select s from Student as s").list();
            
          for(.){.}
          4 不支持select * from...這樣的查詢
          [X]List students=session.createQuery("select * from Student s").list();//錯(cuò)誤的[X]
          5 使用query.iterate查詢
            在默認(rèn)情況下,使用query.iterate查詢,有可能出現(xiàn)N+1問題
            所謂N+1是在查詢的時(shí)候發(fā)出N+1條sql語句
            * 1:先發(fā)出查詢id的sql
           * N:再依次發(fā)出根據(jù)id查詢Student對象的sql
          Iterator iter=session.createQuery("from Student").iterate();
                      
          while(iter.hasNext()){
                          Student stu
          =(Student)iter.next();
                          System.out.println(stu.getName()
          +":"+stu.getCreateTime());
                      }
          6 使用query.list查詢,返回Student對象的集合
            在默認(rèn)情況下list每次都會向數(shù)據(jù)庫發(fā)出查詢對象的sql,除非配置查詢緩存,
            但list默認(rèn)情況下不會利用緩存,而是每次發(fā)出sql
           在默認(rèn)情況下,list會向緩存中放入數(shù)據(jù),但不會利用數(shù)據(jù)
          List students=session.createQuery("from Student").list();
              
          for(.){.}
          7 list和iterate的區(qū)別
            * list:在默認(rèn)情況下每次都會向數(shù)據(jù)庫發(fā)出sql,list會向緩存中放入數(shù)據(jù),但不會利用緩存中的數(shù)據(jù)
            * iterate:在默認(rèn)情況下會利用緩存中的數(shù)據(jù),但緩存中不存在數(shù)據(jù),有可能出現(xiàn)N+1問題


          條件查詢[重要]

          * 方法鏈編程
           Query query=session.createQuery("select id,name from Student where name like ?");
                      query.setParameter(
          0"%1%");
                      List students 
          =query.list();
              
          //等效于:
                  List students=session.createQuery("select id,name from Student where name like ?")
                                                 .setParameter(
          0"%1%")
                                                 .list();
          1 拼字符串
            可以采用拼字符串的方式組織查詢條件
          List students=session.createQuery("select id,name from Student where name like '%1%'").list();
          2 ?傳遞參數(shù)
            可以采用?占位符來傳遞參數(shù),參數(shù)的索引從0開始,傳遞的參數(shù)值不用單引號引起來
            List students=session.createQuery("select id,name from Student where name like ?")
                                             .setParameter(
          0"%1%")
                                             .list();
          3 “:參數(shù)名” 傳遞參數(shù)
            可以采用“:參數(shù)名稱”的方式傳遞參數(shù),效果等同于?占位符方式
            List students=session.createQuery("select id,name from Student where name like :myname")
                                             .setParameter(
          "myname""%1%")
                                             .list();
          4 支持in,采用(:參數(shù)名)傳遞參數(shù)數(shù)組
            支持in,使用“(:參數(shù)名稱)”的方式傳遞數(shù)組,用setParameterList()設(shè)置數(shù)組參數(shù)
            List students=session.createQuery("select id,name from Student where id in (:myids)")
                                             .setParameterList(
          "myids"new Object[]{1,2,3,4,5,6})
                                             .list();
          5 支持and和between
            List students=session.createQuery("select id,name from Student where name like :myname and id=:myid")
                                             .setParameter(
          "myname""%1%")
                                             .setParameter(
          "myid"12)
                                             .list();
              SimpleDateFormat sdf
          =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
              List students
          =session.createQuery("select id,name from Student where createTime between ? and ?")
                                             .setParameter(
          0, sdf.parse("2008-01-10 00:00:00"))
                                             .setParameter(
          1, sdf.parse("2008-02-15 00:00:00"))
                                             .list();
          6 在hql中可以使用數(shù)據(jù)庫中的函數(shù) 
           不建議使用
            List students=session.createQuery("select id,name from Student where date_format(createTime,'%Y-%m')=?")
                                             .setParameter(
          0"2008-02")
                                             .list();

          原生sql查詢

          List students=session.createSQLQuery("select * from t_student).list();
            for(Iterator iter=students.iterator();iter.hasNext();){
                          Object[] obj
          =(Object[])iter.next();
                          System.out.println(obj[
          0]+":"+obj[1]);
                      }

          外置命名查詢

            * 在映射文件中采用<query>標(biāo)簽來定義hql,可以在任何一個(gè)映射文件中,name屬性名能重復(fù)
          <query name="searchStudents">
                      
          <![CDATA[
                           select s from Student s where s.id<?
                      
          ]]>
                  
          </query>
            * 在程序中采用session.getNameQuery()方法得到hql查詢串
           List students=session.getNamedQuery("searchStudents")
                                                     .setParameter(
          010)
                                                     .list();

          查詢過濾器

            * 在映射文件中定義過濾器參數(shù)
              <filter-def name="filtertest">
              
          <filter-param name="myid" type="integer"/>
             
          </filter-def>
            * 在類的映射中使用這些參數(shù)
              <class name="com.my.hibernate.Student">
              
          <filter name="filtertest" condition="id &lt; :myid"/>
            
          </class>
            * 在程序中起用過濾器,傳入?yún)?shù)
              session.enableFilter("filtertest").setParameter("myid"10);
             List students
          =session.createQuery("from Student").list();

          分頁查詢[重要]

          List students=session.createQuery("from Student")
                                                 .setFirstResult(
          0)
                                                 .setMaxResults(
          3)
                                                 .list();
          //setFirstResult()從0開始
          //setMaxResults()每頁顯示多少條數(shù)據(jù)

          對象導(dǎo)航查詢,在hql中采用“.”進(jìn)行導(dǎo)航[重要]

          List students=session.createQuery("select  s.name from Student s where s.classes.name like '%1%'").list();

          連接查詢[重要]

            * 內(nèi)連接
              List students=session.createQuery("select c.name,s.name from Student s join s.classes c")
                                           .list();
                
          // inner可以省略
                  List students=session.createQuery("select c.name,s.name from Student s inner join s.classes c")
                                           .list();
            * 外連接(左連接/右連接)
          //左:
          List students=session.createQuery("select c.name,s.name from Classes c left join c.students s").list();
          //右:
          List students=session.createQuery("select c.name,s.name from Classes c right join c.students s").list();

          統(tǒng)計(jì)查詢[重要]

          List stu=(List)session.createQuery("select count(*) from Student").list();
          // uniqueResult()查詢單一值,返回Long類型
          Long count=(Long)session.createQuery("select count(*) from Student").uniqueResult();
          // 分組查詢問
          List students=(List)session.createQuery("select c.name,count(s) from Student s join s.classes c group by c.name order by c.name").list();


          DML風(fēng)格的查詢

          批量修改、刪除、插入,可能會出現(xiàn)臟數(shù)據(jù),盡量少用,和緩存不同步

          session.createQuery("update Student s set s.name=? where s.id<?")
                     .setParameter(
          0"田田田")
                     .setParameter(
          15)
                     .executeUpdate();


          其他


          is null, and, or, not, in, between
          Restrictions.like("bookname","a",MatchMode.START);
          關(guān)鍵字不區(qū)分大小寫,類名區(qū)分大小寫,類名不能用關(guān)鍵字,類名可以用全名

          select s from Student s where s.name like '%李%'
          select s from Student s where s.name like ?
          query.setString(0,"%李%").list();
          query.setEntity(classes);//對象實(shí)體參數(shù)
          注意jdbc中perstmt參數(shù)從1開始
          from Student s where s.id between :dd and :dr
          query.setInt(dd,1);
          query.setInt(dr,2);
          select j from Tjd j,Tfw f where f.jd=j and fw.lxr='王先生'
          select s from Strudent s,Classes c where s.classes=c //聯(lián)表查詢
          分頁
          query.setFirstResult(0);//默認(rèn)從0開始
          query.setMaxResult(int size);

          posted on 2009-11-03 17:14 junly 閱讀(505) 評論(0)  編輯  收藏 所屬分類: hibernate/orm
          主站蜘蛛池模板: 石楼县| 津市市| 兴安盟| 乐清市| 依安县| 阳信县| 咸丰县| 潍坊市| 汾阳市| 延津县| 静宁县| 安徽省| 东兴市| 深水埗区| 抚顺县| 渑池县| 长垣县| 洛扎县| 区。| 文水县| 志丹县| 长寿区| 白河县| 天柱县| 海南省| 新邵县| 庆安县| 嘉善县| 静宁县| 临邑县| 游戏| 宜宾市| 惠安县| 民勤县| 如皋市| 和平县| 曲周县| 江阴市| 潮安县| 沾益县| 珲春市|