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

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

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

    溫故知新:hibernate_13_常用HQL

    通過hibernate進(jìn)行數(shù)據(jù)的查詢,一般會(huì)采用HQL語句,HQL是將數(shù)據(jù)表對(duì)象化的查詢語言,和SQL類似,但卻是通過面向?qū)ο蟮姆绞饺鴮?,更易于理解。寫一個(gè)測試類,將一般情況下會(huì)用到的HQL寫法記錄下來。
      1 package demo;
      2 
      3 import java.util.List;
      4 
      5 import org.hibernate.Query;
      6 import org.hibernate.Session;
      7 import org.junit.Test;
      8 
      9 import domain.Classroom;
     10 import domain.ReportDto;
     11 import domain.Specialty;
     12 import domain.Student;
     13 import util.HibernateUtil;
     14 
     15 
     16 public class App 
     17 {
     18     
     19     @SuppressWarnings("unchecked")
     20     @Test
     21     public void hqltest01(){
     22         Session session = null;
     23         try {
     24             session = HibernateUtil.openSession();
     25             session.beginTransaction();
     26             //全查詢
     27             Query q = session.createQuery("from Student");
     28             List<Student> ss = q.list();
     29             for (Student s : ss) {
     30                 System.out.println(s.getName());
     31             }
     32             
     33             System.err.println("=================================");
     34             
     35             //條件查詢
     36             Query q1 = session.createQuery("from Student s where s.name like ?")
     37                     .setParameter(0, "%小%");
     38             //還可以基于參數(shù)名的方式,比如hql中為:name,則setParameter("name", "%小%")
     39             List<Student> sss = q1.list();
     40             for (Student s : sss) {
     41                 System.out.println(s.getName());
     42             }
     43             
     44             session.getTransaction().commit();
     45             
     46         } catch (Exception e) {
     47             if (session != null) {
     48                 session.getTransaction().rollback();
     49             }
     50         } finally{
     51             if (session != null) {
     52                 session.close();
     53             }
     54         }
     55     }
     56     
     57     @Test
     58     /**
     59      * 查詢唯一結(jié)果
     60      */
     61     public void hqltest02(){
     62         Session session = null;
     63         try {
     64             session = HibernateUtil.openSession();
     65             session.beginTransaction();
     66             
     67             //查詢記錄的數(shù)量
     68             Query q = session.createQuery("select count(*) from Student");
     69             Long l = (Long) q.uniqueResult();
     70             System.out.println(l);
     71             
     72             //查詢某個(gè)特定對(duì)象
     73             Query q1 = session.createQuery("from Student s where s.id = 1");
     74             Student s =  (Student) q1.uniqueResult();
     75             System.out.println(s.getName());
     76             session.getTransaction().commit();
     77             
     78         } catch (Exception e) {
     79             if (session != null) {
     80                 session.getTransaction().rollback();
     81             }
     82         } finally{
     83             if (session != null) {
     84                 session.close();
     85             }
     86         }
     87     }
     88     
     89     @SuppressWarnings("unchecked")
     90     @Test
     91     /**
     92      * 查詢一個(gè)投影
     93      */
     94     public void hqltest03(){
     95         Session session = null;
     96         try {
     97             session = HibernateUtil.openSession();
     98             session.beginTransaction();
     99             
    100             //查詢記錄的數(shù)量
    101             Query q = session.createQuery("select s.grade,count(*) from Student s group by s.grade");
    102             List<Object[]> objs = q.list();
    103             for (Object[] obj : objs) {
    104                 System.out.println(obj[0]+":"+obj[1]);
    105             }
    106             
    107         } catch (Exception e) {
    108             if (session != null) {
    109                 session.getTransaction().rollback();
    110             }
    111         } finally{
    112             if (session != null) {
    113                 session.close();
    114             }
    115         }
    116     }
    117     
    118     @SuppressWarnings("unchecked")
    119     @Test
    120     /**
    121      * 基于導(dǎo)航對(duì)象進(jìn)行,傳統(tǒng)sql語句進(jìn)行跨表查詢時(shí),需要進(jìn)行連接
    122      * hql提供了導(dǎo)航查詢.
    123      * *但是不建議使用導(dǎo)航查詢,導(dǎo)航查詢使用cross join進(jìn)行查詢,低效
    124      */
    125     public void hqltest04(){
    126         Session session = null;
    127         try {
    128             session = HibernateUtil.openSession();
    129             session.beginTransaction();
    130             
    131             //查詢記錄的數(shù)量
    132             Query q = session.createQuery("from Student s where s.classroom.id = 1");
    133             List<Student> ss = q.list();
    134             for (Student s : ss) {
    135                 System.out.println(s.getName());
    136             }
    137             
    138         } catch (Exception e) {
    139             if (session != null) {
    140                 session.getTransaction().rollback();
    141             }
    142         } finally{
    143             if (session != null) {
    144                 session.close();
    145             }
    146         }
    147     }
    148     
    149     @SuppressWarnings("unchecked")
    150     @Test
    151     /**
    152      * 參數(shù)列表的設(shè)置
    153      */
    154     public void hqltest05(){
    155         Session session = null;
    156         try {
    157             session = HibernateUtil.openSession();
    158             session.beginTransaction();
    159             
    160             //查詢記錄的數(shù)量
    161             Query q = session.createQuery("from Student s where s.classroom.id = ? and s.id in(:sids)");
    162             List<Student> ss = q.setParameter(0, 1).setParameterList("sids", new Object[]{1,3}).list();
    163             for (Student s : ss) {
    164                 System.out.println(s.getName());
    165             }
    166             
    167         } catch (Exception e) {
    168             if (session != null) {
    169                 session.getTransaction().rollback();
    170             }
    171         } finally{
    172             if (session != null) {
    173                 session.close();
    174             }
    175         }
    176     }
    177     
    178     @SuppressWarnings("unchecked")
    179     @Test
    180     /**
    181      * 內(nèi)連接查詢
    182      */
    183     public void hqltest06(){
    184         Session session = null;
    185         try {
    186             session = HibernateUtil.openSession();
    187             session.beginTransaction();
    188             
    189             //查詢記錄的數(shù)量
    190             Query q = session.createQuery("select s from Student s join s.classroom cla where cla.id = 2");
    191             List<Student> ss = q.list();
    192             for (Student s : ss) {
    193                 System.out.println(s.getName());
    194             }
    195             
    196         } catch (Exception e) {
    197             if (session != null) {
    198                 session.getTransaction().rollback();
    199             }
    200         } finally{
    201             if (session != null) {
    202                 session.close();
    203             }
    204         }
    205     }
    206     
    207     
    208     @SuppressWarnings("unchecked")
    209     @Test
    210     /**
    211      * 實(shí)現(xiàn)一個(gè)類似報(bào)表的查詢
    212      */
    213     public void hqltest07(){
    214         Session session = null;
    215         try {
    216             session = HibernateUtil.openSession();
    217             session.beginTransaction();
    218             
    219             //查詢記錄的數(shù)量
    220             Query q = session.createQuery("select stu.name,stu.grade,cla.name,sp.name from Student stu "
    + "left join stu.classroom cla left join stu.classroom.specialty sp ");
    221             List<Object[]> objs = q.list();
    222             for (Object[] s : objs) {
    223                 System.out.println(s[0]+" -- "+ s[1]+" -- " + s[2] + " -- " +s[3] );
    224             }
    225             
    226             //基本的查詢會(huì)返回一個(gè)對(duì)象數(shù)組object[],但是如此一來,在控制層獲取會(huì)很困難
    227             //所以,就需要?jiǎng)?chuàng)建一個(gè)dto對(duì)象來存儲(chǔ)這些查詢出的數(shù)據(jù)
    228             //此處的dto對(duì)象ReportDto,其實(shí)體類中必須包含ReportDto(String name, String grade, String claName, String spName)形式的構(gòu)造函數(shù),才能如下書寫
    229             Query q1 = session.createQuery("select new domain.ReportDto"
    + "(stu.name,stu.grade,cla.name,sp.name) from Student stu)" 
                                    + "left join stu.classroom cla left join stu.classroom.specialty sp ");

    230             List<ReportDto> rds = q1.list();
    231             for (ReportDto rd : rds) {
    232                 System.out.println(rd.getName()+" -- " +rd.getGrade()+" -- "+rd.getClaName()+" -- " + rd.getSpName());
    233             }
    234             
    235         } catch (Exception e) {
    236             e.printStackTrace();
    237             if (session != null) {
    238                 session.getTransaction().rollback();
    239             }
    240         } finally{
    241             if (session != null) {
    242                 session.close();
    243             }
    244         }
    245     }
    246 }
    247 
    說到HQL查詢,就要提到關(guān)聯(lián)對(duì)象間的延遲加載問題,hibernate中的抓取策略和延遲加載息息相關(guān),基于XML配置類文件,通過XML的fetch配置可以自定義抓取策略,XML配置默認(rèn)是select,也就是說,如果當(dāng)前取得的對(duì)象中存在延遲加載對(duì)象,那么在取得延遲加載對(duì)象的時(shí)候,會(huì)通過select語句取得。如果配置為join,則會(huì)通過關(guān)聯(lián)方式取得。對(duì)于使用HQL查詢的對(duì)象無效,需要同過batch-size的設(shè)置,或者使用HQL的時(shí)候,在join關(guān)鍵后添加fetch關(guān)鍵字來抓取?;谧⒔獾姆绞脚渲脤?shí)體類,默認(rèn)會(huì)通過關(guān)聯(lián)join的方式取得。不論是注解的方式還是XML的方式去配置實(shí)體類,配置中的抓取策略只針對(duì)load的對(duì)象有效,HQL查詢會(huì)忽略配置。

    posted on 2015-01-21 14:13 都較瘦 閱讀(104) 評(píng)論(0)  編輯  收藏 所屬分類: ORMFramework

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導(dǎo)航

    統(tǒng)計(jì)

    公告

    博客定位:囿于目前的水平,博客定位在記錄自己的學(xué)習(xí)心得和隨手的練習(xí)

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 最新国产AV无码专区亚洲| 99久久精品免费视频| 国产精品亚洲一区二区在线观看| 亚洲精品视频在线观看免费| 亚洲短视频男人的影院| 亚洲AV日韩AV永久无码久久| 亚洲成A人片在线观看无码不卡| 亚洲精品V欧洲精品V日韩精品| 综合亚洲伊人午夜网 | 亚洲成a人片在线播放| 免费永久在线观看黄网站| 免费人成年激情视频在线观看| 国产亚洲精品免费| 日韩亚洲国产综合久久久| 免费jlzzjlzz在线播放视频| www.亚洲一区| 亚洲中文久久精品无码| 亚洲成AV人片在WWW色猫咪| 久久国产亚洲电影天堂| 久久久久亚洲AV无码网站| 亚洲在成人网在线看| 亚洲乱码在线卡一卡二卡新区| 亚洲日韩av无码中文| 色九月亚洲综合网| 91av免费在线视频| 久久青草免费91观看| 国产免费久久精品99re丫y| 精品无码国产污污污免费| 亚洲免费日韩无码系列| 亚洲精品无码久久久久| 久久精品国产亚洲AV无码偷窥| 亚洲午夜一区二区电影院| 亚洲Av永久无码精品一区二区| 日韩毛片在线免费观看| 伊人免费在线观看高清版| 69影院毛片免费观看视频在线| 在线观看免费人成视频色9| 又粗又大又硬又爽的免费视频 | 成年在线网站免费观看无广告| 亚洲av无码专区在线观看素人| 国产成人A人亚洲精品无码|