随笔 - 6  文章 - 129  trackbacks - 0
<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(14)

随笔档案(6)

文章分类(467)

文章档案(423)

相册

收藏夹(18)

JAVA

搜索

  •  

积分与排名

  • 积分 - 822288
  • 排名 - 49

最新评论

阅读排行榜

评论排行榜

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 阅读(581) 评论(0)  编辑  收藏 所属分类: hibernate

只有注册用户登录后才能发表评论。


网站导航: