1. 程式人生 > >QBC資料查詢 ——hibernate之查詢語句

QBC資料查詢 ——hibernate之查詢語句

敘:之前介紹過hibernate的HQL(hibernate query language)的查詢資料方式,現在我學習記錄一下關於hibernate的另一個查詢資料的方式–QBC,QBC資料查詢全稱是(Query By Criteria資料查詢),下面是我學習的筆記~


QBC資料查詢


1. QBC介紹

QBC(Query By Criteria)查詢方式是Hibernate提供的“更加面向物件”的一種檢索方式。QBC在條件查詢上比HQL查詢更為靈活,而且支援執行時動態生成查詢語句,因此不需要手動設定查詢語句。

QBC查詢主要由Criteria介面、Criterion介面和Expression類組成。Criteria介面是Hibernate API中的一個查詢介面,它需要有session進行建立。Criterion是Criteria的查詢,在Criteria中提供了add(Criterion criterion)方法來新增查詢條件。使用QBC檢索物件的示例程式碼如下圖所示:

//建立 criteria 物件
	Criteria criteria = session.createCriteria(Customer.class); 
	//設定查詢條件
	Criterion criterion = Restrictions.eq("id", 1); 
	//新增查詢條件
	criteria.add(criterion); 
	//執行查詢,返回查詢結果
List<Customer> cs = criteria.list();

上述程式碼中意思是查詢Customer物件所對映的資料表中id為1的資料;

QBC檢索是使用的Restrictions物件編寫查詢條件的,在Restrictions類中提供了大量的靜態方法來建立查詢條件。其常使用的方法如下表所示:
Restrictions類中查詢條件


2 .常見的查詢方法

2.1. 基本查詢
此查詢是QBC的基本查詢方式,沒有任何修飾,查詢所有一張表的所有資料;

    @Test
    	// QBC基本查詢
    	public void demo1() {
    		Session session = HibernateUtils.openSession();
    		Transaction bt = session.beginTransaction();
    		
    		Criteria cust = session.createCriteria(Customer.class);
    		List<Customer> list = cust.list();
    		for (Customer customer : list) {
    			System.out.println(customer);
    		}
    
    		bt.commit();
    		session.close();
    	}

QBC查詢不需要查詢語句,直接在createCriteria()括號中加入索要查詢的表的對映物件名;


2.2. 條件查詢
條件查詢需要使用到add()方法來進行新增查詢條件,呼叫Restrictions類以及這個類中的方法,具體程式碼如下:

@Test
	// QBC條件查詢
	public void demo2() {
		Session session = HibernateUtils.openSession();
		Transaction bt = session.beginTransaction();
		
		Criteria cust = session.createCriteria(Customer.class);
		//Criteria custo = cust.add(Restrictions.idEq(2l));
		Criteria custo = cust.add(Restrictions.eq("cust_name","天線寶寶"));
		//Criteria custo = cust.add(Restrictions.like("cust_name","%羊%"));//模糊查詢
		//Criteria custo = cust.add(Restrictions.gt("cust_id",2l));//id大於2的所有資料
		List<Customer> list = custo.list();
		for (Customer customer : list) {
			System.out.println(customer);
		}

		bt.commit();
		session.close();
	}

程式碼中使用的Restrictions物件的ideq()方法,這個方法是id值等於括號內設定的id值,然後執行後程序會自動匹對id列的所有值;
當然,也可以用模糊查詢like(),範圍查詢gt()等;


2.3. 分頁查詢
QBC的分頁查詢和HQL的分頁查詢一樣,均是由起始索引方法setFirstResult()和每頁最大顯示數方法setMaxResult()來設定,具體程式碼如下:

@Test
	// QBC分頁查詢
	public void demo3() {
		Session session = HibernateUtils.openSession();
		Transaction bt = session.beginTransaction();
		
		Criteria cust = session.createCriteria(Customer.class);
		cust.setFirstResult(2);
		cust.setMaxResults(2);
		List<Customer> list = cust.list();
		for (Customer customer : list) {
			System.out.println(customer);
		}

		bt.commit();
		session.close();
	}

注意:起始索引值是從0開始的,因此想要打印出以id為n開頭的資料時,將索引值設定成n-1方可;


2.4. 排序查詢
使用addOrder()方法然後在方法內部呼叫Order類中的方法,升序或者降序,然後在呼叫的方法內部設定根據物件的哪個屬性進行排序;

@Test
	// QBC排序查詢
	public void demo4() {
		Session session = HibernateUtils.openSession();
		Transaction bt = session.beginTransaction();
		
		Criteria cust = session.createCriteria(Customer.class);
		cust.addOrder(Order.desc("cust_name"));
		List<Customer> list = cust.list();
		for (Customer customer : list) {
			System.out.println(customer);
		}

		bt.commit();
		session.close();
	}

2.5. 統計查詢
統計查詢使用的方法和之前的就有所不同了,使用的是setProjection()方法,然後再方法中呼叫Projections類的查詢規則(就是統計哪方面的資料),詳細程式碼如下:

@Test
	// QBC統計查詢
	public void demo5() {
		Session session = HibernateUtils.openSession();
		Transaction bt = session.beginTransaction();
		
		Criteria cust = session.createCriteria(LinkMan.class);
		cust.setProjection(Projections.rowCount());
		List<Long> list = cust.list();
		System.out.println(list);
		bt.commit();
		session.close();
	}

3. 離線查詢

將離線查詢的業務流程和傳統的criteria的業務流程進行對比:
傳統的Criteria查詢方式

離線Criteria查詢方式

DetachedCriteria翻譯為離線條件查詢,因為它是可以脫離Session 來使用的一種條件查詢物件,我們都知道Criteria物件必須由Session物件來建立。那麼也就是說必須先有Session才可以生成Criteria物件。而 DetachedCriteria物件可以在其他層對條件進行封裝。
這個物件也是比較有用的,尤其在 SSH 整合以後這個物件經常會使用。 它的主要優點是做些特別複雜的條件查詢的時候,往往會在WEB層向業務層傳遞很多的引數,業務層又會將這些引數傳遞給DAO層。 最後在 DAO 中拼接 SQL完成查詢。有了離線條件查詢物件後,那麼這些工作都可以不用關心了, 我們可以在WEB層將資料封裝好,傳遞到業務層,再由業務層傳遞給DAO完成查詢。
具體程式碼如下所示:

@Test
	// QBC離線查詢
	public void demo1() {
		// 模擬web/service層的
		// 1.在web層建立獲取一個離線查詢的物件
		DetachedCriteria lkm = DetachedCriteria.forClass(LinkMan.class);
		// 2.在此物件中加入要查詢的條件(與正常的Criteria查詢中的一樣)
		lkm.add(Restrictions.like("lkm_name","熊%"));
		//-----------------------------------------
		
		
		//-----------------------------------------
		// 在dao層中的程式碼
		Session session = HibernateUtils.openSession();
		Transaction bt = session.beginTransaction();
		// 1.將離線查詢物件與session繫結
		Criteria linkMan = lkm.getExecutableCriteria(session);
		List<LinkMan> list = linkMan.list();
		for (LinkMan linkMan2 : list) {
			System.out.println(linkMan2.getLkm_name());
		}

		bt.commit();
	}

這個知識點並不難,根據註釋記著就行了;


《本章完》