天天看點

Hibernate 檢索查詢的幾種方式



1.非內建Spring

Hibernate的檢索方式,主要有以下五種。

        1.導航對象圖檢索方式。(根據已經加載的對象,導航到其他對象。)

        2.OID檢索方式。(按照對象的OID來檢索對象。)

        3.HQL檢索方式。(使用面向對象的HQL查詢語言。)

        4.QBC檢索方式。(使用QBC(Qurey By Criteria) API來檢索對象。)

        5.本地SQL檢索方式。(使用本地資料庫的SQL查詢語句。)

1、導航對象圖檢索方式

利用類與類之間的關系來檢索對象。譬如我們要查找一份訂單,就可以由訂單對象自動導航找到訂單所屬的客戶對象。當然,前提是必須在對象-關系映射檔案上配置了它們的多對一的關系。

Order  order = (Order )session.get(Order.class,1);

Customer customer = order.getCustomer();

2、OID檢索方式

主要指用Session的get()和load()方法加載某條記錄對應的對象。

Customer  customer = (Customer )session.get(Customer.class,1);

Customer  customer = (Customer )session.load(Customer.class,1);

3、HQL檢索方式

HQL(Hibernate Query Language)是面向對象的查詢語言,它和SQL查詢語言有些相似。在Hibernate提供的各種檢索方式中,HQL是使用最廣的一種檢索方式。它具有以下功能:

        在查詢語句中設定各種查詢條件。

        支援投影查詢,即僅檢索出對象的部分屬性。

        支援分頁查詢。

        支援分組查詢,允許使用group by和having關鍵字。

        提供内置聚集函數,如sum()、min()和max()。

        能夠調用使用者定義的SQL函數。

        支援子查詢,即嵌套查詢。

        支援動态綁定參數。

Session類的Qurey接口支援HQL檢索方式,它提供了以上列出的各種查詢功能。

       注:Qurey接口支援方法鍊程式設計風格,它的set方法都傳回自身執行個體,而不是傳回void類型。方法鍊程式設計風格能使程式代碼更加簡潔。

示例代碼:

[java]  view plain copy

  1.   Query query = session.createQuery("from Customer as c where " +"c.name=:customerName and c.age=:customerAge");     
  2. // 動态綁定參數   
  3.   query.setString("customerName", "Test");    
  4.   query.setInteger("customerAge", 21);     
  5. // 執行檢索     
  6.  List result = query.list();      
  7. // 方法鍊程式設計風格     
  8.  List result1 = session.createQuery( "from Customer as c where c.name=:customerName and c.age=:customerAge").setString( "customerName", "Test").setInteger("customerAge", 21) .list();  

4、QBC(Qurey By Criteria)檢索方式

       采用HQL檢索方式時,在應用程式中需要定義基于字元串形式的HQL查詢語句。QBC API提供了檢索對象的另一種方式,它主要由Criteria接口、Criterion接口和Expression類組成,它支援在運作時動态生成查詢語句。

示例代碼:

[java]  view plain copy

  1. Criteria criteria = session.createCriteria(Customer.class);     
  2. Criterion criterion1 = Expression.like("namr", "T%");     
  3. Criterion criterion2 = Expression.eq("age", new Integer(21));     
  4. criteria = criteria.add(criterion1);     
  5. criteria = criteria.add(criterion2);     
  6. // 執行檢索    List result = criteria.list();      
  7. // 方法鍊程式設計風格    List result1 = session.createCriteria(Customer.class).add(Expression.like("namr""T%")).add(Expression.  
  8. eq("age", new Integer(21))).list();  
  9.        Hibernate還提供了QBE(Qurey By Example)檢索方式,它是QBC的子功能。QBE允許先建立一個随想模闆,然後檢索出和這個樣闆相同的對象。  
  10. 示例代碼:  
  11. Customer exampleCustomer=new Customer();     
  12. exampleCustomer.setAge(21);  
  13. List result1 = session.createCriteria(Customer.class).add( Example.create(exampleCustomer)).list();  

      QBE的功能不是特别強大,僅在某些場合下有用。一個典型的使用場合就是在查詢視窗中讓使用者輸入一系列的查詢條件,然後傳回比對的對象。QBE方式目前隻能支援對象屬性字段的等于查詢和字元串的模糊比對,不能支援區間,或者,大于等操作。在這些情況下,還是采用HQL檢索方式或QBC檢索方式。

5、本地SQL檢索方式

       采用HQL或QBC檢索方式時,Hibernate生成标準的SQL查詢語句,使用于所有的資料庫平台,是以這兩種檢索方式都是跨平台的。有的應用程式可能需要根據底層資料庫的SQL方言,來生成一些特殊的查詢語句。在這種情況下,可以利用Hibernate提供的SQL檢索方式。

示例代碼:

[java]  view plain copy

  1. Query query = session.createSQLQuery("select {c.*} from CUSTOMER as c where c.NAME like :customerName and c.AGE=:customerAge");     
  2. // 動态綁定參數      
  3. query.setString("customerName", "Test");      
  4. query.setInteger("customerAge", 21);     
  5. // 執行檢索   
  6. List result = query.list();  

以上我們看到了五種檢索方式的應用,在實際項目中用的最廣泛的還是HQL和QBC。

2.內建Spring

1.Spring 整合 Hibernate 時候用的 HibernateTemplate 

      HibernateTemplate提供持久層通路模闆,使用HibernateTemplate無須實作特定接口,它隻需要提供一個SessionFactory的引用就可以執行持久化操作。SessionFactory對象既可通過構造函數傳入,也可以通過設值傳入

 HibernateTemplate的常用方法簡介

 void delete(Object entity)

 deleteAll(Collection entities)

 find(String queryString)

 findByNameQuery(String queryName)

 get(Class entityClass,Serializable id)

 save(Object entity)

 saveOrUpdate(Object entity)

 update(Object entity)

 setMaxResults(int maxResults) 設定分頁的大小

2..使用spring的hibernateTemplate的回調機制調用非內建的hibernate原始方法來完成(分頁,sql查詢等操作)

[java]  view plain copy

  1. public List getListForPage(final String hql, final int offset,     
  2.     final int length) {     
  3.    List list = getHibernateTemplate().executeFind(new HibernateCallback() {     
  4.     public Object doInHibernate(Session session)     
  5.       throws HibernateException, SQLException {     
  6.      Query query = session.createQuery(hql);     
  7.      query.setFirstResult(offset);     
  8.      query.setMaxResults(length);     
  9.      List list = query.list();     
  10.      return list;     
  11.     }     
  12.    });     
  13.    return list;     
  14. }