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類型。方法鏈編程風格能使程序代碼更加簡潔。
示例代碼:
- Query query = session.createQuery("from Customer as c where " +"c.name=:customerName and c.age=:customerAge");
- // 動態綁定參數
- query.setString("customerName", "Test");
- query.setInteger("customerAge", 21);
- // 執行檢索
- List result = query.list();
- // 方法鏈編程風格
- 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類組成,它支持在運行時動態生成查詢語句。
示例代碼:
- Criteria criteria = session.createCriteria(Customer.class);
- Criterion criterion1 = Expression.like("namr", "T%");
- Criterion criterion2 = Expression.eq("age", new Integer(21));
- criteria = criteria.add(criterion1);
- criteria = criteria.add(criterion2);
- // 執行檢索 List result = criteria.list();
- // 方法鏈編程風格 List result1 = session.createCriteria(Customer.class).add(Expression.like("namr""T%")).add(Expression.
- eq("age", new Integer(21))).list();
- Hibernate還提供了QBE(Qurey By Example)檢索方式,它是QBC的子功能。QBE允許先創建一個隨想模板,然後檢索出和這個樣板相同的對象。
- 示例代碼:
- Customer exampleCustomer=new Customer();
- exampleCustomer.setAge(21);
- List result1 = session.createCriteria(Customer.class).add( Example.create(exampleCustomer)).list();
QBE的功能不是特別強大,僅在某些場合下有用。一個典型的使用場合就是在查詢窗口中讓用戶輸入一系列的查詢條件,然後返回匹配的對象。QBE方式目前只能支持對象屬性字段的等於查詢和字符串的模糊匹配,不能支持區間,或者,大於等操作。在這些情況下,還是採用HQL檢索方式或QBC檢索方式。
5、本地SQL檢索方式
採用HQL或QBC檢索方式時,Hibernate生成標準的SQL查詢語句,使用於所有的數據庫平臺,因此這兩種檢索方式都是跨平臺的。有的應用程序可能需要根據底層數據庫的SQL方言,來生成一些特殊的查詢語句。在這種情況下,可以利用Hibernate提供的SQL檢索方式。
示例代碼:
- Query query = session.createSQLQuery("select {c.*} from CUSTOMER as c where c.NAME like :customerName and c.AGE=:customerAge");
- // 動態綁定參數
- query.setString("customerName", "Test");
- query.setInteger("customerAge", 21);
- // 執行檢索
- 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查詢等操作)
- /**
- * 使用hql 語句進行操作
- * @param hql
- * @param offset
- * @param length
- * @return List
- */
- public List getListForPage(final String hql, final int offset,
- final int length) {
- List list = getHibernateTemplate().executeFind(new HibernateCallback() {
- public Object doInHibernate(Session session)
- throws HibernateException, SQLException {
- Query query = session.createQuery(hql);
- query.setFirstResult(offset);
- query.setMaxResults(length);
- List list = query.list();
- return list;
- }
- });
- return list;
- }