eric-1001c

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            3 隨筆 :: 45 文章 :: 12 評論 :: 0 Trackbacks
          HQL:
          CreateQuery()
              Query query = session.createQuery("from Customer as c where c.name=:customerName and c.age=:customerAge");
              query.setString("customerName","Tom");
              query.setInteger("customerAge",21);

          createQuery()支持方法鏈編程風格

          QBC:(Criteria,Criterion,Expression)
              Criteria criteria = session.createCriteria(Customer.class);
              Criterion criterion1 = Expression.like("name", "T%");
              Criterion criterion2 = Expression.like("age", new Integer(21));
              Criteria = criteria.add(criterion1).add(criterion2);
              List result = criteria.list();

          HQL&&QBC支持多態和繼承查詢
          HQL&&QBC支持排序和分頁
              HQL: Query query = session.createQuery("from Customer c order by c. name asc, c.age desc"); //排序
                         query.setFirstResult(10);  //設定從對象開始檢索起始位置為0
                                        query.setMaxResults(10); //設定一次最多檢索出的對象數目
              QBC: Criteria criteria = session.createCriteria(Customer.class);
                         criteria.addOrder(Order.asc("name"));
                         criteria.addOrder(Order.desc("age"));
                         criteria.setFirstResult(0); //設定從對象開始檢索起始位置為0
                         criteria.setMaxResult(10); //設定一次最多檢索出的對象數目

          參數綁定能有效避免一些安全漏洞

          HIbernate還能在xml文件里面配置HQL或者SQL本地查詢語句:
              //for HQL
              <hibernate-mapping>
                   <class name="mypack.Customer" table="CUSTOMERS">
                   ...
                                 </class>

                                <query name="findCustomersByName"><![CDATA[from Customer c where c.name like :name]]></query>
                             </hibernate-mapping>
              //for SQL
              <sql-query name="findCustomersByName"><![CDATA[select {c.*} from CUSTOMERS c where c.NAME like :name]]>
                  <return alias="c" class="Customer"/>
              </sql-query>
              在程序中使用getNamedQuery()方法獲得查詢語句:
                  Query query = session.getNamedQuery("findCustomersByName");
                  query.setString("name",name);
                  List result = query.list();


          內連接:利用內連接可獲取兩表的公共部分的記錄Select * from A JOIN B ON A.Aid=B.Bnameid


          當查詢的只是對象的部分屬性的時候, 可以采用動態實例化查詢結果,把實體的部分屬性封裝為一個javabean臨時對象,不需要創建對象-關系映射文件
              package mypack;
              import java.io.Serializable;
              public class CustomerRow implements Serializable{
                  private Long id;
                  private String name;    
                  private String orderNumber;
                  
                  public CustomerRow(Long id, String name, String orderNumber){
                      this,id=id;
                      ...
                  }
                  ...
                   此處省略id,name和orderNumber屬性的get和set方法
                  ...
              }
              在程序中可以結合HQL查詢語句這樣使用,
              Iterator it = session.createQuery("select new mypack.CustomerRow(c.id,c.name,o.orderNumber)'
                      +'from Customer c join c,orders o where o,orderNumber like 'T%'").list().iterator();
              此外如果結果集只有一個結果,可以用uniqueResult()方法
              Object[] obj = (Object[])session.createQuery("select max(c.age),min(c.age) from Customer c").uniqueResult();
              Integer maxAge = (Integer) obj[0];
              Integer minAge = (Integer) obj[1];

          結果集中可以通過利用set和sql的distinct去掉

          動態查詢適宜用QBC檢索方式,可以簡化編程:
              public List findCustomers (String name, int age) throws HibernateException{
                  Criteria criteria = session,createCriteria(Customer,class);
                  if(name != null){
                      criteria.add(Expression.like("name",nam.toLowerCase(),MactchMode.ANYWHWERE));    
                  }
                  if(age!=0){
                      crteria.add(Expression.eq("age",new Integer(age)));
                  }
                  
                  return criteria.list();
                      
              }

          集合過濾: 當orders集合由于使用延遲檢索策略而沒有在開始被初始化,當調用get***().iterator()方法初始化的時候不能對這個集合進行排序或者條件過濾,通過使

          用集合過濾就能解決這個問題:
              List result = session.createFilter(customer.getOrders(), "where this.price>100 order by this.price")  .list();
          集合過濾除了用于為集合排序或設置約束條件,還可以:
              1) 為集合分頁
              List result = session.createFilter(customer.getOrders(), "order by this,price asc")
                  .setFirstResult(10)
                  .setMaxResult(50)
                  .list();
              2)只選擇集合的某個屬性
              List result = session.createFilter(customer.getOrders(), "select this.orderNumber").list();
          posted on 2008-02-18 16:11 Eric-1001c 閱讀(237) 評論(0)  編輯  收藏 所屬分類: Hibernate
          主站蜘蛛池模板: 洛扎县| 射洪县| 丁青县| 洛隆县| 磐安县| 淅川县| 茂名市| 海门市| 延津县| 长丰县| 平泉县| 衡水市| 久治县| 遂溪县| 五常市| 舟曲县| 道孚县| 黄浦区| 尼木县| 游戏| 乐业县| 佳木斯市| 全椒县| 合山市| 丹东市| 长乐市| 开阳县| 呼和浩特市| 思南县| 尖扎县| 微博| 武邑县| 图木舒克市| 吉安县| 会昌县| 松阳县| 呼玛县| 石景山区| 科技| 塘沽区| 万源市|