Criteria Query:通过面向对象化的设计,将数据查询条件封装成一个对象。Hibernate在运行期会根据Criteria中指定的查询条件来生成相应的SQL语句。
Criteria本身是一个查询容器,具体查询条件通过Criteria.add()方法添加到Criteria实例中去。
Criteria crit = session.createCriteria(Class);
crit.add(Expression.eq("name","LiuYun"));
list = crit.list();
示例查询:Example,根据已有对象,查询属性中与之相符的其他对象。
Criteria crit = session.createCriteria(TPerson.class);
Object obj = new Object();
crit.add(Example.create(obj));
list = crit.list();
Hibernate默认会过滤掉实例对象中值为NULL的属性。常用的场景是组合查询,即界面上若干查询选项,然后根据用户的选择返回符合条件的结果。
Criteria 高级特性
限定返回的记录范围、排序
Criteria crit = session.createCriteria(TPerson.class);
crit.add(Expression.gt("age",new Integer(20)));
crit.setFirstResult(10);//从第10条开始显示
crit.setMaxResult(20);//显示20条数据
crit.addOrder(Order.desc("name"));//按"name"降序排列
list = crit.list();//查询结果
分组、统计
ProjectionList proList = Projections.projectionList ();
proList.add(Projections.groupProperty("age"));
proList.add(Projections.rowCount());
Criteria crit = session.createCriteria(TPerson.class);
crit.setProjection(proList);
List list = crit.list();
但是Criteria生命周期位于其宿主Session生命周期之内,一旦Session销毁,则Criteria实例也随之失效,这在很大程度上限制了Criteria的重用,利用DetachedCriteria实现Criteria,DetachedCriteria可以脱离Session实例独立存在,这样就可以将某些通用的Criteria查询条件进行抽离,每次使用时再与当前Session实例绑定,从而获得更好的代码重用效果。
Criteria接口继承了CriteriaSpecification接口,DetachedCriteria类实现了CriteriaSpecification接口。
DetachedCriteria detaCriteria = DetachedCriteria.forClass(TPerson.class);//得到DetachedCriteria实例
DetachedCriteria实例可以实现查询子句,需要时再与Session绑定从而获得运行期的Criteria实例。这样查询逻辑与Criteria实例相分离,获得代码重用效果。
detaCriteria.add(Expression.eq("name","Fang Hewei"));//查询逻辑
detaCriteria.add(Expression.gt("age", new Integer(20)));
Criteria crit= detaCriteria.getExecutableCriteria(session);//与Session实例绑定
List list = crit.list();