一。比较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();//返回查询结果
}