DetachedCriteria可以脱离session的生命周期,对应相同的查询条件可以重复使用,增加了查询条件的重用性,同时不用每次使用criteria时都要重复创建session,而session的销毁同时也会使得criteria失效,使用DetachedCriteria可以在每次使用时与当前的session实例绑定可以获得更好的代码重用性,同时使某些通用的查询条件抽离出来。此为DetachedCriteria的作用之一:
实例代码:
public void testDetached(){
TUser user=new TUser();
DetachedCriteria deCriteria=DetachedCriteria.forClass(TUser.class);
deCriteria.add(Expression.eq("name", "sky"));
Criteria criteria=deCriteria.getExecutableCriteria(session);
Iterator it=criteria.list().iterator();
while(it.hasNext()){
user=(TUser)it.next();
System.out.println(user.getName()+" "+user.getAge()+" "+user.getId());
}
}
作用之二:
用于子查询表达式:
public void testDetach(){
TUser user=null;
DetachedCriteria avgAge=DetachedCriteria.forClass(TUser.class);
avgAge.setProjection(Projections.avg("age"));
Criteria criteria=session.createCriteria(TUser.class);
criteria.add(Subqueries.propertyGt("age", avgAge));
List list=criteria.list();
for(int i=0;i<list.size();i++){
user=(TUser)list.get(i);
System.out.println(user.getAge()+" "+user.getName());
}
}