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

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

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

    隨筆 - 6  文章 - 129  trackbacks - 0
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(14)

    隨筆檔案(6)

    文章分類(467)

    文章檔案(423)

    相冊

    收藏夾(18)

    JAVA

    搜索

    •  

    積分與排名

    • 積分 - 826309
    • 排名 - 49

    最新評論

    閱讀排行榜

    評論排行榜

     Hibernate的檢索策略

    立即檢索、延遲檢索,預先抓取和批量檢索都是為了優化加載性能而設置的策略。立即加載、延遲加載、預先抓取是同一級別的策略,因為它們是三選一的策略。用了其中一個則另外兩個就不可用了,而且被延遲加載的對象當最終被加載時,一定是使用了立即加載的形式。如果在配置文件中設置了對某個屬性的預先抓取,則對此屬性的其他加載設置全部失效(比如還設置了延遲加載,此時失效)。批量檢索可以優化立即檢索和延遲加載,它們可以同時使用,即批量立即加載和批量延遲加載

    立即檢索   類級別的立即加載關聯對象 關聯級別的立即加載指定對象的關聯對象可以設定批量檢索數量
    延時檢索   類級別的延時加載關聯對象 關聯級別的延時加載指定對象的關聯對象可以設定批量檢索數量  
    迫切左外連接檢索 類級別不適用關聯級別通過左外連接加載與檢索方法指定對象關聯的對象
     
    涉及到的元素屬性
    <class>
    <set>lazy 默認是true  表示延時檢索
    <many-to-one><one-to-one><set>
    outer-join             <many-to-one><one-to-one>默認auto    <set> 默認   false     
    <class>
    <set>batch-size默認1 指定批量檢索的數量           

    延時檢索時會產生代理類
    但是僅僅初始化了OID 其他都為null
    只有當訪問除ID外的屬性或者修改時才會加載數據庫的數據
    有可能在你關閉session后仍沒有初始化對象也就沒有完整的游離對象  
    只有在session范圍內才能被初始化
    '  get()
    方法加載的對象時實際相關數據不是代理類

    一對多和多對多的檢索策略
    <set>
    lazyout-join
    都為false 立即檢索
    lazy
    false out-jointrue是迫切左外連接檢索(當有多個<set>只允許一個用)
    相反時用延時檢索策略

                                                        Hibernate的檢索方式

    HQL檢索方式: 
          1 
    通過SessioncreateQuery()方法創建一個Query對象包含一HQL查詢語句
          2 
    可以動態綁定參數
          3 
    可以調用list()方法返回List類型的結果
    exp :
          List result = session.createQuery(".......").setString("name",name).setInteger("age", 21).list();


    QBC檢索方式:
          1 
    session的才createCriteria()方法創建一個Criteria對象
          2 
    可以設定查詢的條件Expression的一些靜態方法Expression.like("name", "T%")
                   Expression.eq("age", new Integer(21)
          3 
    可以使用方法鏈也可以調用list()方法返回List類型的結果
    exp :
          List result = session.createCriteria(Customer.class).add(Restrictions.like("name", "T%")).add(Restrictions.eq("age", new Integer(21)).list();
          4 
    還可以使用QBE模板檢索方式
    exp :
          Customer exp = new Customer();
          exp.setName("tom");

          List result =session.createCriteria(Customer.class).add(Example.create(exp)).list();

    SQL檢索方式:

    Query query=session.createSQLQuery("..............");


    由于檢索和HQL比較雜亂分別舉例說明

    ' 最簡單的查詢

    HQL

    Session session=sessionFactory.openSession();
                    Transaction tx=
    null;
                    
    try
                    
    {
                            tx=session.beginTransaction();
                            
                            List result=session.createQuery("from Customer ").list();
                            
    for(Iterator it=result.iterator(); it.hasNext();)
                            
    {
                                    Customer c =(Customer)it.next();
                                    System.out.println("Customer's name :" + c.getName());
                                    System.out.println("Customer's age :" + c.getAge());
                            }
                            tx.commit();
                    }
                    
    catch(Exception e)
                    
    {
                            
    if(tx!=null)
                            
    {
                                    tx.rollback();
                            }
                            
    throw e;
                    }

    BQC

    ...
    List result=session.createCriteria(Customer.
    class).list();
    ...

    ' 指定查詢和命名別名

    HQL

    ...
    List result=session.createQuery("from Customer as c where name=:name").setString("name", "Tom").list();
    ...

    BQC

    ...
    List result=session.createCriteria(Customer.
    class).add(Restrictions.eq("name", "Tom")).list();
    ...

    ' 對查詢結果排序

    desc是降序

    HQL

    ...
    List result=session.createQuery("from Customer as c order by c.name").list();
    List result=session.createQuery("from Customer as c order by c.name asc, c.age desc").list();
    ...

    BQC

    ...
    List result=session.createCriteria(Customer.
    class).addOrder(Order.asc("name")).addOrder(Order.desc("age")).list();
    ...

    ' 在指定時間范圍內查詢結果

    ...
                          tx=session.beginTransaction();
                            Date beginDate=java.sql.Date.valueOf("2006-8-1");
                            Date endDate=java.sql.Date.valueOf("2006-9-1");
                            List result=session.createQuery("from Customer c where c.retime <:endTime and c.retime >=:beginTime").setTimestamp("endTime", endDate).setTimestamp("beginTime", beginDate).list();
    ...

    ' 分頁查詢

    HQL

    ...
    List result=session.createQuery("from Customer c Order by c.name asc").setFirstResult(0).setMaxResults(3).list();
    ...

    BQC

    ...
    List result=session.createCriteria(Customer.
    class).addOrder(Order.asc("name")).setFirstResult(0).setMaxResults(3).list();
    ...

    ' 檢索單個對象

    uniqueResult() 方法
    如果不確定返回的時單個對象先用QueryCriteriaserMaxResult(1)方法設定只返回一個對象

    如果確定只返回一個對象比如from Customer c where c.id1

    ' HQL的兩種綁定查詢

    1

    session.createQuery("from Customer c where c.name=:name and c.age=:age").setString("name", "tom").setInteger("age", 20)

    2

    session.createQuery("from Customer c where c.name=? and c.age=?").setString(0, "tom").setInteger(1, 20)

    ' 特殊綁定方法

    1
    setEntity() 
    可以綁定實體對象

    session.createQuery("from Order o where o.customer=:customer").setEntity("customer", customer)

    2
    setParameter
    綁定任意類型的參數

    Query query=session.createQuery("from Order o where o.customer=:customer and o.orderNumber like: orderNumber ");
    query.setParameter("customer", customer, Hibernate.entity(Customer.
    class));
    query.setParameter("orderNumber", orderNumber, Hibernate.STRING)

    3
    setProperties()
    與一個對象的屬性綁定

    Customer customer = new Customer();
    customer.setName("Tom");
    customer.setAge(21);
    List result=session.createQuery("from Customer c where c.name=:name and c.age=:age").setProperties(customer).list();

    ' 設定查詢條件

    ' 比較運算大于某個條件
    HQL

    ...
    List result=session.createQuery("from Customer c where c.age>23").list();
    ...

    BQC

    ...
    List result=session.createCriteria(Customer.
    class).add(Restrictions.gt("age", new Integer(23))).list();
    ...

    ' 比較運算不等于某個條件

    HQL

    ...
    List result=session.createQuery("from Customer c where c.age<>24").list();
    ...

    BQC

    ...
    List result=session.createCriteria(Customer.
    class).add(Restrictions.not(Restrictions.eq("age", new Integer(23)))).list();
    ...

    ' 比較運算條件為null的某個對象

    HQL

    ...
    List result=session.createQuery("from Order o where o.customer is null").list();
    ...

    BQC

    ...
    List result=session.createCriteria(Order.
    class)
                                    .add(Restrictions.isNull("customer")).list();
    ...

    ' 范圍運算檢索在某個范圍內String

    HQL

    ...
    List result=session.createQuery("from Customer c where c.name in('Tom','Mike','Jack')").list();
    ...

    BQC

    ...
    String[] names=
    {"Tom", "Mike", "Jack"};
    List result=session.createCriteria(Customer.
    class)
      .add(Restrictions.in("name", names)).list();
    ...

    ' 范圍運算檢索在某個范圍內Integer

    HQL


    ...
    List result=session.createQuery("from Customer c where c.age between 24 and 30").list();
    ...

    BQC

    ...
    List result=session.createCriteria(Customer.
    class)
    .add(Restrictions.between("age", 
    new Integer(24), new Integer(30))).list();
    ...

    不在某個范圍內

    HQL

    ...
    List result=session.createQuery("from Customer c where c.age not between 24 and 30").list();
    ...

    BQC

    ...
    List result=session.createCriteria(Customer.
    class)
    .add(Restrictions.not(Restrictions.between("age", 
    new Integer(24), new Integer(30)))).list();
    ...

    ' 范圍運算字符串通配符

    T 開頭
    HQL like 'T%'  
    BQC add(Restrictions.like("name","T%"))

    T 結尾
    HQL like '%T'
    BQC add(Restrictions.like("name","%T"))

    包含 T
    HQL like '%T%'
    BQC add(Restrictions.like("name","%T%"))

    控制長度為3
    HQL like 'T_ _'
    BQC add(Restrictions.like("name","T_ _"))

    另外
    Restrictions
    還有這樣的方法like(java.lang.String propertyName, java.lang.String value, MatchMode matchMode)
    有一些定義好的field 具體查看API

    ' 邏輯運算檢索復雜條件

    條件結合
    HQL

    ...
    List result=session.createQuery("from Customer c where c.name like 'T%' and c.name like '%m'").list();
    ...

    BQC

    ...
    List result=session.createCriteria(Customer.
    class)
    .add(Restrictions.like("name", "T%")).add(Restrictions.like("name", "%m")).list();
    ...

    邏輯與
    Restriction
    有如下方法
    or(Criterion lhs, Criterion rhs)
    and(Criterion lhs, Criterion rhs

    HQL

    ...
    List result=session.createQuery("from Customer c where (c.name like 'T%' and c.name like '%m') or (c.age not between 20 and 25)").list();
    ...

    BQC

    ...
    List result=session.createCriteria(Customer.
    class).add(Restrictions.or(Restrictions.and(Restrictions.like("name", "T%"), Restrictions.like("name", "%m")), Restrictions.not(Restrictions.between("age", new Integer(20), new Integer(25))))).list();
    ...

    報表查詢

    from 關鍵字是必須 select group by having 用于報表查詢

    投影查詢只檢索出需要的字段

    HQL

    ...
    List result=session.createQuery("select c.id, c.name, o.orderNumber from Customer c join c.orders o where o.orderNumber like 'T%'").list();
                            Iterator it=result.iterator();
                            
    while(it.hasNext())
                            
    {
                                    Object[] row=(Object[])it.next();
                                    Long id=(Long)row[0];
                                    String name=(String)row[1];
                                    String orderNumber=(String)row[2];
                                    System.out.println(id+" "+name+" "+orderNumber);
                            }
    ...

    這個list返回的結果是集合存放的是關系數據
    也可以建立一個javabean來讓結果更清晰

    ...
    select 
    new ergal.CustomerRow(c.id, c.name, o.orderNumber) from Customer c join c.orders o where o.orderNumber like 'T%'
    ...

    while(it.hasNest())
    {
            CustomerRow cr=(CustomerRow)it.next();
            Long id=(Long)cr.getId();
            ......
    }

    分組查詢

    查詢相同姓名的的記錄

    ...
    List result=session.createQuery("select  c.name, count(c) from Customer c group by c.name").list();
                            Iterator it=result.iterator();
                            
    while(it.hasNext())
                            
    {
                                    Object[] row=(Object[])it.next();
                                    String name=(String)row[0];
                                    Long id=(Long)row[1];
                                    System.out.println(id+" "+name);
                            }
    ...

    統計訂單數目

    ...
    List result=session.createQuery("select  c.id, c.name, count(o) from Customer c join c.orders o group by c.id").list();
                            Iterator it=result.iterator();
                            
    while(it.hasNext())
                            
    {
                                    Object[] row=(Object[])it.next();
                                    Long id=(Long)row[0];
                                    String name=(String)row[1];
                                    Long num=(Long)row[2];                                
                                    System.out.println(num+" "+name+" "+id);
                            }
    ...

    統計每個客戶的訂單總價-右外連接

    ...
    List result=session.createQuery("select  c.id, c.name, sum(o.price) from Customer c right outer join c.orders o group by c.id").list();
                            Iterator it=result.iterator();
                            
    while(it.hasNext())
                            
    {
                                    Object[] row=(Object[])it.next();
                                    Long id=(Long)row[0];
                                    String name=(String)row[1];
                                    Double num=(Double)row[2];                                
                                    System.out.println(num+" "+name+" "+id);
                            }
    ...

    統計每個客戶的訂單總價-加條件訂單大于一的

    ...
    List result=session.createQuery("select  c.id, c.name, sum(o.price) from Customer c join c.orders o group by c.id having(count(o)>1)").list();
                            Iterator it=result.iterator();
                            
    while(it.hasNext())
                            
    {
                                    Object[] row=(Object[])it.next();
                                    Long id=(Long)row[0];
                                    String name=(String)row[1];
                                    Double num=(Double)row[2];                                
                                    System.out.println(num+" "+name+" "+id);
                            }
    ...

    查詢時間段

                tx=session.beginTransaction();
                Date beginDate=java.sql.Date.valueOf("2006-8-1");
                Date endDate=java.sql.Date.valueOf("2006-9-1");
                List result=session.createQuery("from Customer c where c.retime <:endTime and c.retime >=:beginTime").setTimestamp("endTime", endDate).setTimestamp("beginTime", beginDate).list();
                 
    for(Iterator it=result.iterator(); it.hasNext();)
                            
    {
                                    Customer c =(Customer)it.next();
                                    System.out.println("Customer's name :" + c.getName());
                                    System.out.println("Customer's regiestertime :" + c.getRetime());
                            }

    總的來說就是將顯示時間數據庫的時間都進行轉化然后進行比較

     

     

    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1191506



    posted on 2007-09-16 14:52 Ke 閱讀(1688) 評論(0)  編輯  收藏 所屬分類: hibernate
    主站蜘蛛池模板: 伊人久久亚洲综合| 亚洲麻豆精品果冻传媒| 国产免费拔擦拔擦8X高清在线人| 亚洲精品线在线观看| 免费观看黄网站在线播放| 人妻巨大乳hd免费看| 亚洲精品国产肉丝袜久久| 四虎国产精品免费视| 无码av免费网站| 国产91成人精品亚洲精品| 久久91亚洲精品中文字幕| 在线永久免费观看黄网站| 日韩免费人妻AV无码专区蜜桃| 亚洲av成人一区二区三区在线播放| 亚洲国产精品无码久久SM| 精品久久久久久久免费加勒比| 女同免费毛片在线播放| 国产成人精品日本亚洲语音| 亚洲视频.com| 久久精品国产亚洲精品| 免费观看大片毛片| 中文字幕在线免费| 两性色午夜视频免费播放| 亚洲国产精品成人综合色在线| 亚洲V无码一区二区三区四区观看| 国产免费观看青青草原网站| 99re热免费精品视频观看| 国产精品区免费视频| 人妻免费久久久久久久了| 亚洲国产美女精品久久久 | 亚洲av无码片在线观看| 亚洲精品亚洲人成在线观看| 国产jizzjizz免费看jizz| 曰批全过程免费视频在线观看 | 四虎在线成人免费网站| 中国国产高清免费av片| 黄色一级免费网站| 亚洲成av人片天堂网无码】| 亚洲w码欧洲s码免费| 在线观看亚洲人成网站| 亚洲AV午夜成人片|