1. Criteria相關介紹
Criteria叫標準化條件查詢,是比HQL更面向對象的查詢語句.稱為QBC(Query By Criteria)
Criteria介面:代表一個查詢.它是一個查詢條件的容器,通過add()方法向其實例中添加查詢條件.
Criterion介面:代表一種面向對象的查詢條件.它的實例是作為Criteria介面add()方法的參數添加到Criteria實例中的.
Restrictions類:是用來創建查詢條件Criterion實例的工具類,它提供了一系列的靜態方法用來設定查詢條件並作為Criterion實例返回.
2. 具體實現步驟
//1.創建Criteria查詢語句
Criteria criteria = session.createCriteria(Employee.class);
//2.給查詢出來的語句設定查詢條件
Criterion criterion1 = Restrictions.ge("salary", new Double(4000.00));
Criterion criterion2 = Restrictions.like("loginName", "z%");
//3.把查詢條件放到Criteria語句
criteria.add(criterion1);
criteria.add(criterion2);
//排序,可寫可不寫
criteria.addOrder(Order.desc("id"));
List<Employee> list = criteria.list();
3.動態查詢
在編程時無法確定要查詢的欄位.即用戶在在網頁上面自由選擇某些查詢條件,程序根據用戶的選擇條件,動態生成SQL語句進行查詢.
例子:(比如某些網站的高級查詢)
//StudentDAOImpl.java
public List findStudents(String name,String classes){
Criteria crit=session.createCriteria(Student.class);
if(name!=null&&name!=""){ //如果填寫了名字,添加查詢名字的條件
crit.add(Restrictions.like("name",name));
}
If(classes!=null&&classes!=""}{
crit.add(Restrictions.eq("classes",classes));
}
Crit.addOrder(Order.asc("name");
return crit.list();
4. 離線查詢
DetachedCriteria類支持離線查詢.所謂離線查詢就是指一個Session範圍之外創建好一個查詢,然後在需要使用時再附加到一個Session實例上來執行它.
對於分層的web應用程序來說,web層需要傳遞一個查詢條件列表給業務邏輯層,業務層對象獲得這個條件后依次取出條件值,然後拼裝出SQL查詢語句.這裡的一個難點是如何將用戶的多項查詢條件傳入業務邏輯層.
Criteria與session是綁定的.在web層,使用DetachedCriteria來構造查詢條件,然後將這個DetachedCriteria作為方法調用參數傳遞給業務邏輯層對象.而業務層對象獲得DetachedCriteria之後,可以在session範圍內直接構造Criteria,進行查詢.這樣,查詢語句的構造脫離了session範圍,完全被移植到web層實現.
例子:
//StudentDAO.java
public List findStudents(DetachedCriteria detchedCriteria){
List list=null;
//打開session,開啟事務
Criteria Criteria=detachedCriteria.getExecutableCriteria(session);
list=criteria.list();
//提交事務,關閉session
return list;
}
DetachedCriteria detchedCriteria=DetachedCriteria.forClass(Student.class);
String name="獲取名字";
String age="獲取班級";
if(name!=null&&name!=""){ //如果填寫了名字,添加查詢名字的條件
detchedCriteria.add(Restrictions.like("name",name));
}
If(classes!=null&&classes!=""}{ detchedCriteria.add(Restrictions.eq("classes",classes));
}
detchedCriteria.addOrder(Order.asc("name");
List list=StudentDAO.findStudents(detchedCriteria);
for(){…}
5. 示例查詢(QBE)
根據一個給定的實例類實例來構建一個條件查詢的方式.先創建一個對象樣板,然後檢索出所有和這個樣板相同的對象.在查詢表單中填寫的項,可以封裝成一個對象,這就是對象樣板.
public static void testQBE(Employee employee){
//開啟事務
//根據傳入的employee實例來創建查詢條件
Example example = Example.create(employee)
.excludeZeroes() //排除0值的屬性
.excludeProperty("color") //排除指定的屬性
.ignoreCase() //對所有的字元串類型的屬性值忽略大小寫比較
.enableLike(); //對所有的字元串類型的屬性值使用like比較
List<Employee> results = session.createCriteria(Employee.class)
.add(example) .list();
for (Employee empl : results) {
System.out.println(empl.getLoginName() "," empl.getSalary()); }
//提交事務 //關閉Session }
Employee empl=new Employee();
empl.setLonginName("%z%");
testQBE(empl);
6. Native SQL Queries
原生SQL查詢:就是指直接使用標準SQL語句或特定資料庫的SQL進行查詢.對原生SQL查詢執行的控制是通過SQLQuery介面進行的,通過Session上調用createSQLQuery()來獲取這個介面.
1).實體查詢
Hibernate執行原生SQL查詢后,自動把查詢到的表格式的數據集封裝到實體對象中.
2). 標量查詢
3).定義成命名查詢來使用
7. 小結
HQL功能最強大,適合各種情況,但動態查詢構造起來不方便;Criteria最適合動態條件查詢,不太適合統計查詢;QBE還不夠強大,只適合相當簡單的查詢;NativeSQL可以實現特定資料庫的SQL,但可移植不好.
針對Web應用來說,動態查詢,首先Criteria,但是涉及統計查詢和非常複雜的關聯查詢,Criteria就無能為力了,這種情況下選擇HQL.HQL常用來進行實體檢索,要注意返回的list中的元素是實體還是實體數組QBC 不會忽略配置文件中的預先抓取策略.
[火星人 ] hibernate.的QBC語句已經有1005次圍觀