<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    簡(jiǎn)單屬性查詢[重要]
    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è)屬性查詢,返回的集合元素是對(duì)象數(shù)組
      數(shù)組元素的類型和對(duì)應(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  對(duì)象化查詢,可以采用hql動(dòng)態(tài)實(shí)例化Student對(duì)象,此時(shí)list中為Student對(duì)象集合
       注意,必須有在實(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í)體對(duì)象查詢[重要]


    1 忽略select,返回Student對(duì)象的集合,可以忽略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對(duì)象的集合,可以使用別名,兩種方式都支持:空格或as
    List students=session.createQuery("from Student s").list();
      List students
    =session.createQuery("from Student as s").list();
      
    for(.){.}
    3 使用select,返回Student對(duì)象的集合,使用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對(duì)象的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對(duì)象的集合
      在默認(rèn)情況下list每次都會(huì)向數(shù)據(jù)庫發(fā)出查詢對(duì)象的sql,除非配置查詢緩存,
      但list默認(rèn)情況下不會(huì)利用緩存,而是每次發(fā)出sql
     在默認(rèn)情況下,list會(huì)向緩存中放入數(shù)據(jù),但不會(huì)利用數(shù)據(jù)
    List students=session.createQuery("from Student").list();
        
    for(.){.}
    7 list和iterate的區(qū)別
      * list:在默認(rèn)情況下每次都會(huì)向數(shù)據(jù)庫發(fā)出sql,list會(huì)向緩存中放入數(shù)據(jù),但不會(huì)利用緩存中的數(shù)據(jù)
      * iterate:在默認(rèn)情況下會(huì)利用緩存中的數(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ù)值不用單引號(hào)引起來
      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ù)

    對(duì)象導(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)格的查詢

    批量修改、刪除、插入,可能會(huì)出現(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);//對(duì)象實(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 閱讀(501) 評(píng)論(0)  編輯  收藏 所屬分類: hibernate/orm
    主站蜘蛛池模板: 亚洲人成伊人成综合网久久| 久久精品国产精品亚洲人人| 亚洲综合激情九月婷婷| 亚洲免费一区二区| 亚洲乱亚洲乱少妇无码| yellow免费网站| 亚洲性日韩精品国产一区二区| 国产精品亚洲色图| 日产国产精品亚洲系列| 免费一区二区无码视频在线播放 | 美女扒开尿口给男人爽免费视频| 成年美女黄网站18禁免费| 亚洲an日韩专区在线| 4hu四虎最新免费地址| 亚洲最大成人网色香蕉| 成人性生免费视频| 亚洲AV色无码乱码在线观看| 日韩视频在线免费观看| 色婷婷亚洲一区二区三区| 国产国拍亚洲精品福利 | 亚洲精品福利你懂| 免费看又爽又黄禁片视频1000| 亚洲AV日韩AV一区二区三曲| 亚洲 综合 国产 欧洲 丝袜 | 91青青青国产在观免费影视| 亚洲1234区乱码| 国产免费牲交视频| 91在线视频免费观看| 亚洲视频一区在线| 日本最新免费不卡二区在线| 成人a毛片免费视频观看| 久久国产亚洲精品麻豆| 日本妇人成熟免费中文字幕| 亚洲人成网站色7799| 伊人久久大香线蕉亚洲| 精品国产sm捆绑最大网免费站| 亚洲中文精品久久久久久不卡| 久久精品国产亚洲Aⅴ香蕉 | 午夜私人影院免费体验区| 成人免费网站久久久| 亚洲最大的成网4438|