1. HQL查詢-hibernate Query Languagesql
Query表明面向對象的一個Hibernate查詢操做。在Hibernate中,一般使用session.createQuery()方法接受一個HQL語句,而後調用Query的list()或uniqueResult()方法執行查詢。所謂的HQL是Hibernate Query Language縮寫,其語法很像SQL語法,但它是徹底面向對象的。數據庫
在Hibernate中使用Query對象的步驟,具體所示:數組
1. 得到Hibernate的Session對象;網絡
2. 編寫HQL語句;session
3. 調用session.createQuery建立查詢對象;框架
4. 若是HQL語句包含參數,則調用Query的setXxx設置參數;ide
5. 調用Query對象的list()或uniqueResult()方法執行查詢;函數
實例:spa
1 @Test 2 public void demo9() { 3 // 1. 建立HQL語句 4 Transaction tx = session.beginTransaction(); 5 Query query = session.createQuery(" from Customer "); 6 // 2. 獲取查詢結果 7 List<Customer> list = query.list(); 8 System.out.println(list); 9 tx.commit(); 10 }
1 @Test 2 public void demo10() { 3 // 1. 建立HQL語句 4 Transaction tx = session.beginTransaction(); 5 Query query = session.createQuery(" from Customer where cust_id = ? "); 6 // 2.獲取查詢結果 7 query.setParameter(0, 5l); 8 Customer c = (Customer)query.uniqueResult(); 9 System.out.println(c); 10 tx.commit(); 11 } 12 13 @Test 14 public void demo11() { 15 // 1. 建立HQL語句 16 Transaction tx = session.beginTransaction(); 17 Query query = session.createQuery(" from Customer where cust_name = ? "); 18 // 2.獲取查詢結果 19 query.setString(0, "百度"); 20 Customer c = (Customer)query.uniqueResult(); 21 System.out.println(c); 22 tx.commit(); 23 }
1 @Test 2 public void demo12() { 3 // 1. 建立HQL語句 4 Transaction tx = session.beginTransaction(); 5 Query query = session.createQuery(" from Customer where cust_id = :cust_id and cust_name = :cust_name "); 6 // 2.獲取查詢結果 7 query.setParameter("cust_id", 1l); 8 query.setParameter("cust_name", "nakelulu"); 9 Customer c = (Customer)query.uniqueResult(); 10 System.out.println(c); 11 tx.commit(); 12 }
1 @Test 2 public void demo13() { 3 // 1. 建立HQL語句 4 Transaction tx = session.beginTransaction(); 5 Query query = session.createQuery(" from Customer "); 6 // 2.獲取查詢結果 7 query.setFirstResult(2); 8 query.setMaxResults(3); 9 List<Customer> c = query.list(); 10 System.out.println(c); 11 tx.commit(); 12 }
程序經過使用Query接口,將customer表中的三條數據所有輸出。更詳細的HQL使用,會在後續講解。hibernate
Query中除了使用list()方法查詢所有數據外,還有其它一些經常使用方法,具體以下:
1. setter方法:Query接口中提供了一系列的setter方法用於設置查詢語句中的參數,針對不一樣的數據類型,須要用到不一樣的setter方法。
2. iterator()方法:該方法用於查詢語句,返回的結果是一個Iterator對象,在讀取時只能按照順序方式讀取,它僅把使用到的數據轉換成Java實體對象。
3. executeUpdate()方法:該方法是Hibernate3的新特性,它支持HQL語句的更新和刪除操做。
4. setFirstResult()方法:該方法能夠設置獲取第一個記錄的位置,也就是它表示從第幾條記錄開始查詢,默認從0開始計算。
5. setMaxResult()方法:該方法用於設置結果集的最大記錄數,一般與setFirstResult()方法結合使用,用於限制結果集的範圍,以實現分頁功能。
整體來講:Hibernate獨家查詢語言,屬於面向對象的查詢語言,HQL查詢-hibernate Query Language(多表查詢,但不復雜時使用)。
2. Criteria--Hibernate自創的無語句面向對象查詢,適用於--單表條件查詢。
Criteria是一個徹底面向對象,可擴展的條件查詢API,經過它徹底不須要考慮數據庫底層如何實現,以及SQL語句如何編寫,它是Hibernate框架的核心查詢對象。Criteria查詢,又稱爲QBC查詢(Query by Criteria),它是Hibernate的另外一種對象檢索方式。
org.hibernate.criterion.Criterion是Hibernate提供的一個面向對象查詢條件接口,一個單獨的查詢就是Citerion接口的一個實例,用於限制Criteria對象的查詢,在Hibernate中Criterion對象的建立一般是經過Restrictions工廠類完成的,它提供了條件查詢方法。
一般,使用Criteria對象查詢數據的主要步驟,具體以下:
1. 得到Hibernate的Session對象。
2. 經過Session得到Criteria對象。
3. 使用Restrictions的靜態方法建立Criterion條件對象。Restrictions類中提供了一系列用於設定查詢條件的靜態方法,這些靜態方法都返回Criterion實例,每一個Criterion實例表明一個查詢條件。
4. 項Criteria對象中添加Criterion查詢條件。Criteria的add()方法用於加入查詢條件。
5. 執行Criteria的list()或uniqueResult()得到結果。
實例:
1 @Test 2 public void demo1() { 3 Transaction tx = session.beginTransaction(); 4 Criteria criteria = session.createCriteria(Customer.class); 5 List<Customer> list = criteria.list(); 6 System.out.println(list); 7 tx.commit(); 8 }
1 @Test 2 public void demo2() { 3 Transaction tx = session.beginTransaction(); 4 Criteria criteria = session.createCriteria(Customer.class); 5 criteria.add(Restrictions.eq("cust_name", "老王")); 6 List<Customer> list = criteria.list(); 7 System.out.println(list); 8 tx.commit(); 9 } 10 11 @Test 12 public void demo3() { 13 Transaction tx = session.beginTransaction(); 14 Criteria criteria = session.createCriteria(Customer.class); 15 criteria.add(Restrictions.eq("cust_name", "老王")); 16 criteria.add(Restrictions.eq("cust_source", "網絡推廣")); 17 List<Customer> list = criteria.list(); 18 System.out.println(list); 19 tx.commit(); 20 }
1 @Test 2 public void demo4() { 3 Transaction tx = session.beginTransaction(); 4 Criteria criteria = session.createCriteria(Customer.class); 5 criteria.add(Restrictions.eq("cust_name", "老王")); 6 criteria.add(Restrictions.eq("cust_source", "網絡推廣")); 7 criteria.setFirstResult(1); 8 criteria.setMaxResults(2); 9 List<Customer> list = criteria.list(); 10 System.out.println(list); 11 tx.commit(); 12 }
1 @Test 2 public void demo5() { 3 Transaction tx = session.beginTransaction(); 4 Criteria criteria = session.createCriteria(Customer.class); 5 criteria.setProjection(Projections.rowCount()); // 設置查詢的聚合函數,總行數 6 Long count = (Long) criteria.uniqueResult(); 7 System.out.println(count); 8 tx.commit(); 9 }
在Criteria對象中,除了使用criteria.list()方法查詢所有數據外,還有其它一些經常使用方法:若是隻返回一個值時,可使用criteria的uniqueResult()方法;若是須要分頁時可使用setFirstResult()和setMaxRequest()兩個方法,setFirstResult()方法表示從第幾條記錄開始查詢,setMaxRequest()方法表示查詢幾條記錄。
3. SQLQuery---適用於複雜的業務查詢
SQLQuery這個就比較簡單了,這個接口用於接收一個sql語句進行查詢,而後調用list()或者uniqueResult()方法進行查詢。可是sql語句不會直接封裝到實體對象中,須要咱們手動寫代碼才能夠封裝到實體中。
1 @Test 2 public void demo1() { 3 Transaction tx = session.beginTransaction(); 4 SQLQuery sqlQuery = session.createSQLQuery("select * from cst_customer"); 5 List<Object[]> list = sqlQuery.list(); 6 for(Object[] object: list) { 7 System.out.println(Arrays.toString(object)); 8 } 9 tx.commit(); 10 }
1 @Test 2 public void demo2() { 3 Transaction tx = session.beginTransaction(); 4 SQLQuery sqlQuery = session.createSQLQuery("select * from cst_customer"); 5 sqlQuery.addEntity(Customer.class); 6 List<Customer> list = sqlQuery.list(); 7 for(Customer cust: list) { 8 System.out.println(cust); 9 } 10 tx.commit(); 11 }
1 @Test 2 public void demo3() { 3 Transaction tx = session.beginTransaction(); 4 SQLQuery sqlQuery = session.createSQLQuery("select * from cst_customer where cust_name=?"); 5 sqlQuery.setParameter(0, "網絡推廣"); 6 sqlQuery.addEntity(Customer.class); 7 List<Customer> list = sqlQuery.list(); 8 System.out.println(list); 9 }
1 @Test 2 public void demo4() { 3 Transaction tx = session.beginTransaction(); 4 SQLQuery sqlQuery = session.createSQLQuery("select * from cst_customer limit ?,?"); 5 sqlQuery.setParameter(0, 0); 6 sqlQuery.setParameter(1, 3); 7 sqlQuery.addEntity(Customer.class); 8 List<Customer> list = sqlQuery.list(); 9 System.out.println(list); 10 }