Criteria相關介紹
Criteria叫標准化條件查詢是比HQL更面向對象的查詢語句稱為QBC(Query By Criteria)
Criteria接口代表一個查詢它是一個查詢條件的容器通過add()方法向其實例中添加查詢條件
Criterion接口代表一種面向對象的查詢條件它的實例是作為Criteria接口add()方法的參數添加到Criteria實例中的
Restrictions類是用來創建查詢條件Criterion實例的工具類它提供了一系列的靜態方法用來設定查詢條件並作為Criterion實例返回
具體實現步驟
//創建Criteria查詢語句
Criteria criteria = sessioncreateCriteria(Employeeclass)
//給查詢出來的語句設定查詢條件
Criterion criterion = Restrictionsge(salary new Double())
Criterion criterion = Restrictionslike(loginName z%)
//把查詢條件放到Criteria語句
criteriaadd(criterion)
criteriaadd(criterion)
//排序可寫可不寫
criteriaaddOrder(Orderdesc(id))
List<Employee> list = criterialist()
動態查詢
在編程時無法確定要查詢的字段即用戶在在網頁上面自由選擇某些查詢條件程序根據用戶的選擇條件動態生成SQL語句進行查詢
例子(比如某些網站的高級查詢)
//StudentDAOImpljava
public List findStudents(String nameString classes){
Criteria crit=sessioncreateCriteria(Studentclass)
if(name!=null&&name!=){ //如果填寫了名字添加查詢名字的條件
critadd(Restrictionslike(namename))
}
If(classes!=null&&classes!=}{
critadd(Restrictionseq(classesclasses))
}
CritaddOrder(Orderasc(name)
return critlist()
離線查詢
DetachedCriteria類支持離線查詢所謂離線查詢就是指一個Session范圍之外創建好一個查詢然後在需要使用時再附加到一個Session實例上來執行它
對於分層的web應用程序來說web層需要傳遞一個查詢條件列表給業務邏輯層業務層對象獲得這個條件後依次取出條件值然後拼裝出SQL查詢語句這裡的一個難點是如何將用戶的多項查詢條件傳入業務邏輯層
Criteria與session是綁定的在web層使用DetachedCriteria來構造查詢條件然後將這個DetachedCriteria作為方法調用參數傳遞給業務邏輯層對象而業務層對象獲得DetachedCriteria之後可以在session范圍內直接構造Criteria進行查詢這樣查詢語句的構造脫離了session范圍完全被移植到web層實現
例子
//StudentDAOjava
public List findStudents(DetachedCriteria detchedCriteria){
List list=null;
//打開session開啟事務
Criteria Criteria=detachedCriteriagetExecutableCriteria(session)
list=criterialist()
//提交事務關閉session
return list;
}
DetachedCriteria detchedCriteria=DetachedCriteriaforClass(Studentclass)
String name=獲取名字;
String age=獲取班級;
if(name!=null&&name!=){ //如果填寫了名字添加查詢名字的條件
detchedCriteriaadd(Restrictionslike(namename))
}
If(classes!=null&&classes!=}{ detchedCriteriaadd(Restrictionseq(classesclasses))
}
detchedCriteriaaddOrder(Orderasc(name)
List list=StudentDAOfindStudents(detchedCriteria)
for(){…}
示例查詢(QBE)
根據一個給定的實例類實例來構建一個條件查詢的方式先創建一個對象樣板然後檢索出所有和這個樣板相同的對象在查詢表單中填寫的項可以封裝成一個對象這就是對象樣板
public static void testQBE(Employee employee){
//開啟事務
//根據傳入的employee實例來創建查詢條件
Example example = Examplecreate(employee)
excludeZeroes() //排除值的屬性
excludeProperty(color) //排除指定的屬性
ignoreCase() //對所有的字符串類型的屬性值忽略大小寫比較
enableLike() //對所有的字符串類型的屬性值使用like比較
List<Employee> results = sessioncreateCriteria(Employeeclass)
add(example) list()
for (Employee empl : results) {
Systemoutprintln(emplgetLoginName() + + emplgetSalary()) }
//提交事務 //關閉Session }
Employee empl=new Employee()
emplsetLonginName(%z%)
testQBE(empl)
Native SQL Queries
原生SQL查詢就是指直接使用標准SQL語句或特定數據庫的SQL進行查詢對原生SQL查詢執行的控制是通過SQLQuery接口進行的通過Session上調用createSQLQuery()來獲取這個接口
)實體查詢
Hibernate執行原生SQL查詢後自動把查詢到的表格式的數據集封裝到實體對象中
) 標量查詢
)定義成命名查詢來使用
小結
HQL功能最強大適合各種情況但動態查詢構造起來不方便Criteria最適合動態條件查詢不太適合統計查詢QBE還不夠強大只適合相當簡單的查詢NativeSQL可以實現特定數據庫的SQL但可移植不好
針對Web應用來說動態查詢首先Criteria但是涉及統計查詢和非常復雜的關聯查詢Criteria就無能為力了這種情況下選擇HQLHQL常用來進行實體檢索要注意返回的list中的元素是實體還是實體數組QBC 不會忽略配置文件中的預先抓取策略
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28563.html