DetachedCriteria
使用Criteria可以很好地使用實現動態查詢,但是Criteria與Session綁定,其生命周期跟隨著Session的
結束而結束,使用Criteria進行查詢時,每次都要在執行時期動態建立對象,并回味入各種查詢條件,跟著
Session的回收,Criteria也跟著回收.當然在WEB層也可以打開Session建立Criteia,但是這不符合分層
要求,層之間耦合太嚴重.DetachedCriteria可以解決這個問題,即在WEB層,程序員要以使用DetachedCriteria
來構造查詢條件,然后將這個DetachedCriteria作為方法調用參數傳遞給業務層對象.而業務層對象獲得
DetachedCriteria之后,可以在Session范圍內直接構造Criteria,然后進行查詢.這樣,查詢語句的構造脫離
了Session范圍,完全被移支到WEB層實現,而業務層則只負責完成持久化和查詢封裝即可,與查詢條件的構造
完全解耦.
在StudentDAO.java中編寫一個方法,在Session范圍內以傳入的DetachedCriteria作為查詢條件進行查詢,
并返回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頁面,或是示例程序的main()中)編寫如下代碼來構造查詢條件:
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);
}
}
posted on 2007-08-23 21:56
Ke 閱讀(582)
評論(0) 編輯 收藏 所屬分類:
hibernate