您的位置:首页 > 其它

Hibernate使用DetachedCriteria和Criteria查询

2014-12-18 14:40 519 查看
一。比较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();//返回查询结果
	}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: