DetachedCriteria和Criteria

在常规的Web编程中,有大量的动态条件查询,即用户在网页上面自由选择某些条件,程序根据用户的选择条件,动态生成SQL语句,进行查询。
  针对这种需求,对于分层应用程序来说,Web层需要传递一个查询的条件列表给业务层对象,业务层对象获得这个条件列表之后,然后依次取出条件,构造查询语句。这里的一个难点是条件列表用什么来构造?传统上使用Map,但是这种方式缺陷很大,Map可以传递的信息非常有限,只能传递name和value,无法传递究竟要做怎样的条件运算,究竟是大于,小于,like,还是其它的什么,业务层对象必须确切掌握每条entry的隐含条件。因此一旦隐含条件改变,业务层对象的查询构造算法必须相应修改,但是这种查询条件的改变是隐式约定的,而不是程序代码约束的,因此非常容易出错。
   DetachedCriteria可以解决这个问题,即在web层,程序员使用DetachedCriteria来构造查询条件,然后将这个 DetachedCriteria作为方法调用参数传递给业务层对象。而业务层对象获得DetachedCriteria之后,可以在session范围内直接构造Criteria,进行查询。就此,查询语句的构造完全被搬离到web层实现,而业务层则只负责完成持久化和查询的封装即可,与查询条件构造完全解耦,非常完美!

Criteria 和 DetachedCriteria 的主要区别在于创建的形式不一样, Criteria 是在线的,所以它是由hibernate Session 进行创建的;而 DetachedCriteria 是离线的,创建时无需Session ,DetachedCriteria 提供了 2 个静态方法 forClass(Class) 或 forEntityName(Name)进行DetachedCriteria 实例的创建。    spring 的框架提供了getHibernateTemplate().findByCriteria(detachedCriteria) 方法可以很方便地根据DetachedCriteria 来返回查询结果。

Criteria: 查詢User表格中的所有資料: Criteria criteria = session.createCriteria(User.class); // 查詢user所有欄位 List users = criteria.list(); Iterator iterator =  users.iterator(); while(iterator.hasNext()) {     User user = (User) iterator.next();     System.out.println(user.getId() + user.getName());            }
Hibernate实际上使用以下的SQL來查詢: select this_.id as id0_, this_.name as name0_0_ from user this_
Criteria只是个容器,如果想要設定查詢條件,則要使用add()方法加入Restrictions的条件限制 ,例如查詢age大於20且小於40的資料: Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.gt("age", new Integer(20))); criteria.add(Restrictions.lt("age", new Integer(40))); List users = criteria.list();
您也可以使用逻辑組合來进行查詢,例如結合age等於(eq)20或(or)age為空(isNull)的條件: Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.or(                    Restrictions.eq("age", new Integer(20)),                    Restrictions.isNull("age")                )); List users = criteria.list();

DetachedCriteria的关联查询:

假设要通过stuName查询一个学生Student记录,可以如下:

DetachedCriteria dc = DetachedCriteria.forClass(Student.class);     dc.add(Restrictions.like("stuName", stuName, MatchMode.ANYWHERE));         如果要通过Student的Team的teamName查询一个Student记录,很多人都会这么写:  DetachedCriteria dc = DetachedCriteria.forClass(Student.class);      dc.add(Restrictions.like("team.teamName", teamName, MatchMode.ANYWHERE));         遗憾的是上述程序报错,说是在Student中找不到team.teamName属性,这是可以理解的。那么如何通过teamName查找Student呢?  可以这么写:  DetachedCriteria dc = DetachedCriteria.forClass(Student.class);      dc.createAlias("team", "t");      dc.add(Restrictions.like("t.teamName", teamName, MatchMode.ANYWHERE));        没错,就是要先建立team的引用,才能用team导航到teamName 。 
这里有一个特殊情况,如果是对引用对象的id查询,则可以不用建立引用,也就是可以不调用createAlias()语句,如下所示:  DetachedCriteria dc = DetachedCriteria.forClass(Student.class);      dc.add(Restrictions.like("team.id", teamId, MatchMode.ANYWHERE));        据我个人的经验,team后只能跟其主键属性,比较其他属性要用别名。此主键属性可以用“id”字符来指代,也可以用team的主键属性来指代。换句话说,我的Student类的类主键“stuId”,不管是在HQL还是在QBC中,都可以用stu.id来指代stu.stuId。在这里可以看出 “id”字符的特殊性。上述是个人观点,并未得到确实的证实。

DetachedCriteria:

例子1:如果每个美女都有自己的客户资源(不要想歪了!),那么需要查询拥有客户Gates的美女怎么办? 两种方法: 1: DetachedCriteria beautyCriteria = DetachedCriteria.forClass(Beauty.class).createCriteria("customers"); beautyCriteria.add(Restrictions.eq("name", "Gates")):
2: DetachedCriteria beautyCriteria = DetachedCriteria.forClass(Beauty.class).createAlias("customers", "c"); beautyCriteria.add(Restrictions.eq("c.name", "Gates")):
接着有了新的要求,年纪太大的美女不要,还是查找拥有客户Gates的,条件如下: DetachedCriteria beautyCriteria = DetachedCriteria.forClass(Beauty.class, "b").; DetachedCriteria customerCriteria = beautyCriteria.createAlias("customers", c"); beautyCriteria.add(Restrictions.le("b.age", new Long(20))): customerCriteria.add(Restrictions.eq("c.name", "Gates")):
关于Criteria更详细的资料,Hibernate的源代码和测试是最好的文档。 Criteria的缺点?DBA很生气,后果很严重。

例子2:

Department和Employee是一对多关联,查询条件为:    名称是“department”开发部门;    部门里面的雇员年龄大于20岁;

DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class); detachedCriteria.add(Restrictions.eq("name", "department"))                  .createAlias("employees", "e")                  .add(Restrictions.gt(("e.age"), new Integer(20)));

List  list = this.getHibernateTemplate().findByCriteria(detachedCriteria

时间: 2024-10-10 21:24:58

DetachedCriteria和Criteria的相关文章

Criteria和DetachedCriteria的区别与应用

Hibernate 设计了CriteriaSpecification 作为 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria .     Criteria 和 DetachedCriteria 的主要区别在于创建的形式不一样, Criteria 是在线的,所以它是由 Hibernate Session 进行创建的:而 DetachedCriteria 是离线的,创建时无需 Session,DetachedCriteria 提供了 2 个静态方法 forC

转:Hibernate中Criteria和DetachedCriteria的完整用法

原文地址:http://blog.sina.com.cn/s/blog_667528fd0100rkrf.html 设计上可以灵活的根据 Criteria 的特点来方便地进行查询条件的组装.现在对 Hibernate的Criteria 的用法进行总结:   Hibernate 设计了 CriteriaSpecification 作为 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria .   Criteria 和 DetachedCriteria 的主要区

Criteria查询初学者的采纳点哦

一.Hibernate提供了5种检索对象的方式 1.导航对象图检索方式:根据已经加载的对象导航到其他对象    from  Emp e group by e.dept.deptName 2.OID检索方式:按照对象的OID来检索对象  get/load 3.HQL检索方式:使用面向对象的HQL查询语言 4.QBC检索方式:使用QBC(Query By Criteria)API来检索对象,这种API封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口 5.本地SQL检索方式:使用本地数据库

Hibernate之Criteria的完整用法

Criteria的完整用法 QBE (Query By Example) Criteria cri = session.createCriteria(Student.class); cri.add(Example.create(s)); //s是一个Student对象 list cri.list(); 实质:创建一个模版,比如我有一个表serial有一个 giftortoy字段,我设置serial.setgifttoy("2"), 则这个表中的所有的giftortoy为2的数据都会出来

hibernate Criteria 使用

: QBE (Query By Example)    Criteria cri = session.createCriteria(Student.class);    cri.add(Example.create(s)); //s是一个Student对象    list cri.list();       实质:创建一个模版,比如我有一个表serial有一个 giftortoy字段,我设置serial.setgifttoy("2"),          则这个表中的所有的giftor

Hibernate中criteria的使用

最近在项目中使用 Spring 和 Hibernate 进行开发,有感于 Criteria 比较好用,在查询方法 设计上可以灵活的根据 Criteria 的特点来方便地进行查询条件的组装.现在对 Hibernate的Criteria 的用法进行总结:    Hibernate 设计了 CriteriaSpecification 作为 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria . Criteria 和 DetachedCriteria 的主要区

Hibernate3的DetachedCriteria支持

Hibernate3支持DetachedCriteria,这是一个非常有意义的特性!我们知道,在常规的Web编程中,有大量的动态条件查询,即用户在网页上面自由选择某些条件,程序根据用户的选择条件,动态生成SQL语句,进行查询. 针对这种需求,对于分层应用程序来说,Web层需要传递一个查询的条件列表给业务层对象,业务层对象获得这个条件列表之后,然后依次取出条件,构造查询语句.这里的一个难点是条件列表用什么来构造?传统上使用Map,但是这种方式缺陷很大,Map可以传递的信息非常有限,只能传递name

DetachedCriteria的使用

设计上可以灵活的根据 Criteria 的特点来方便地进行查询条件的组装.现在对 Hibernate的Criteria 的用法进行总结: Hibernate 设计了 CriteriaSpecification 作为 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria . Criteria 和 DetachedCriteria 的主要区别在于创建的形式不一样, Criteria 是在线的,所 以它是由 Hibernate Session 进行创建的:而 De

Java面试题下

这部分主要是开源Java EE框架方面的内容,包括hibernate.MyBatis.spring.Spring MVC等,由于Struts 2已经是明日黄花,在这里就不讨论Struts 2的面试题,如果需要了解相关内容,可以参考我的另一篇文章<Java面试题集(86-115)>.此外,这篇文章还对企业应用架构.大型网站架构和应用服务器优化等内容进行了简单的探讨,这些内容相信对面试会很有帮助. 126.什么是ORM?答:对象关系映射(Object-Relational Mapping,简称OR