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類中提供了大量的靜態方法來建立查詢條件。其常使用的方法如下表所示:
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的業務流程進行對比:
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();
}
這個知識點並不難,根據註釋記著就行了;