DetachedCriteria
使用Criteria可以很好地使用實(shí)現(xiàn)動(dòng)態(tài)查詢(xún),但是Criteria與Session綁定,其生命周期跟隨著Session的
結(jié)束而結(jié)束,使用Criteria進(jìn)行查詢(xún)時(shí),每次都要在執(zhí)行時(shí)期動(dòng)態(tài)建立對(duì)象,并回味入各種查詢(xún)條件,跟著
Session的回收,Criteria也跟著回收.當(dāng)然在WEB層也可以打開(kāi)Session建立Criteia,但是這不符合分層
要求,層之間耦合太嚴(yán)重.DetachedCriteria可以解決這個(gè)問(wèn)題,即在WEB層,程序員要以使用DetachedCriteria
來(lái)構(gòu)造查詢(xún)條件,然后將這個(gè)DetachedCriteria作為方法調(diào)用參數(shù)傳遞給業(yè)務(wù)層對(duì)象.而業(yè)務(wù)層對(duì)象獲得
DetachedCriteria之后,可以在Session范圍內(nèi)直接構(gòu)造Criteria,然后進(jìn)行查詢(xún).這樣,查詢(xún)語(yǔ)句的構(gòu)造脫離
了Session范圍,完全被移支到WEB層實(shí)現(xiàn),而業(yè)務(wù)層則只負(fù)責(zé)完成持久化和查詢(xún)封裝即可,與查詢(xún)條件的構(gòu)造
完全解耦.
在StudentDAO.java中編寫(xiě)一個(gè)方法,在Session范圍內(nèi)以傳入的DetachedCriteria作為查詢(xún)條件進(jìn)行查詢(xún),
并返回list集合,如以下程序
public List findStudent(DetachedCriteria detachedCriteria)
{
List list = null;
/*open session and begin transaciton*/
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
list = criteria.list();
/*commit transaction and close session*/
return list;
}
然后在Session之外(JSP頁(yè)面,或是示例程序的main()中)編寫(xiě)如下代碼來(lái)構(gòu)造查詢(xún)條件:
public static main(String[] args)throws HibernateException{
DetachedCriteria detachCriteria = DetachedCriteria.forClass(Student.class);
String name = "aaa";
int age = "18";
if(name != null){
detachedCriteria.add(Restrictions.like("name",name,MatchMode.ANYWHERE));
}
if(age != 0){
detachedCriteria.add(Restrictions.eq("age",new Integer(age)));
}
detachedCriteria.addOrder(Order.asc("name"));//排序
List list = StudentDAO.findStudent(detachedCriteria);
for(int i=0;i<list.size();i++)
{
Student stu = (Student)list.get(i);
}
}