Hibernate使用DetachedCriteria和Criteria查询

一。比较HQL和Criteria


HQL是Hibernate官方推荐的查询方式,涵盖了Criteria的功能,更加全面、灵活,对于熟悉SQL的开发者来说比后者直观许多,维护比较简单,语句执行效率也较高(速度上SQL>HQL>Criteria)。

Criteria则是面向对象的查询方式,毕竟HQL还是字符串拼接,不够OO。Criteria支持动态扩展条件,拼装方便。

动态条件查询,用Criteria更加合适,如果要对Hibernate做二次封装,也是用它更好扩展。但如果是不会变动的代码,比起HQL,Criteria反而需要写更多的代码,维护起来也更加困难。

HQL在编译的时候只当是普通的字符串,只有在运行的时候才会发现其中可能存在的bug(比如少了间隔的空格或是引号遗漏之类)。如果没有单元测试,粗心大意的话会浪费非常多的时间;而Criteria虽然也无法在编译时对字段名字打错这样的bug进行检查,但至少可以检查到其他如条件、连接这样的语法部分。


二。使用Criteria


下面是Criteria接口使用图


 CriteriaSpecification 作为 父接口,下面提供了 Criteria和DetachedCriteria 。

1.创建方式:

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


2.设置查询条件

使用 Criterion 和 Projection 设置查询条件Criteria 提供了 add(Criterion criterion) 方法来   
添加查询条件。  
Criterion 接口的主要实现包括: Example 、 Junction 和 SimpleExpression 。

可以通过Restrictions工具类创建 Criterion,Restrictions提供大量静态方法,例如eq(),gt(),lt(),like()等。

3.查询

调用list()方法即可返回查询将诶过。

示例:

  情景:查询某个名字的学生

public void testDetacheCriteria(){
		Student s = new Student(); //测试学生实体类
		DetachedCriteria dc = DetachedCriteria.forClass(Student.class);  //创建实例
		dc.add(Restrictions.eq("stuName",
				s.getStuName()));  //设置查询条件
		List<Student> stus = dc.getExecutableCriteria(session).list();//返回查询结果
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值