3.3Hibernate批量查詢

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     }
基本查詢 返回數組list
 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     }
基本查詢 返回對象list
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     }
分頁查詢

相關文章
相關標籤/搜索