Hibernate数据检索:
Criteria Query:通过面向对象化的设计,将数据查询条件封装为一个对象。Criteria本身只是一个查询容器,具体的查询条件需要通过Criteria.add方法添加到Criteria实例中。Expression对象具体描述了查询条件。
示例查询并不常用,一方面它的使用比较繁琐,另外从可读性上来讲也不如Expression来的直观。但是在某些情况下却有其特别的用途。
示例查询最常用的场景是组合查询。我们常常需要在界面上提供若干查询选项,然后根据用户的选择返回复合条件的结果。实例查询在这里能发
挥其特长:
package com.wyq.demo.common.criteriaquery;
import java.util.Iterator;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
/**
* @author 作者
* @version 创建时间:2008-11-29 上午09:26:48
* 类说明
*/
public class TestCriteria {
/**
* @authorwyq
* @功能:
* @param args
*/
public static void main(String[] args) {
Session session = null;
//新建一个criteria查询容器
Criteria criteria = session.createCriteria(TUser.class);
/*(1)cireria查询
* 构造查询条件,Expression对象具体描述了查询条件
* 在Hibernate3中,引入了Restrictions类作为Expression的替代
* Expression.eq 等于
* Expression.allEq 参数为一个map包好了多个属性-值对应关系
* Expression.gt 大于
* Expression.ge 大于等于
* Expression.lt 小于
* Expression.le 小于等于
* Expression.between 表示某个字段位于2个数之间
* Expression.like 模糊查询
* Expression.in 范围查询
* Expression.eqProperty 用于比较2个属性之间的值"field=field"
* Expression.gtProperty 属性1>属性2
* Expression.geProperty 属性1>=属性2
* Expression.ltProperty 属性1<属性2
* Expression.leProperty 属性1<=属性2
* Expression.and and关系组合
* Expression.or or关系组合
* Expression.sql 通过这个方法直接通过SQL语句限定查询条件
*/
criteria.add(Expression.eq("name","Erica"));
criteria.add(Expression.eq("sex",new Integer(1)));
/*(2)示例查询
* Example类实现了Criterion接口,同样,它也可以用作Criteria的查询条件。Example
* 的作用是:根据已有对象,查找属性与之相符的其他对象
* 示例查询最常用的场景是组合查询。我们常常需要在界面上提供若干查询选项,然后
* 根据用户的选择返回符合条件的结果。
* Example example = Example.create(cat)
* excludeZeroes() //exclude zero valued properties
* excludeProperty("color") //exclude the property named "color"
* ignoreCase() //perform case insensitive string comparisons
* enableLike(); //use like for string comparisons
* List results = session.createCriteria(Cat.class)
* add(example)
* list();
*/
TUser exampleUser = new TUser();
exampleUser.setName("Erica");
criteria.add(Example.create(exampleUser));
/*
* (3)复合查询
* 在原有查询的基础上,针对TUser对象的addresses属性构造了新的查询过滤条件
*/
Criteria addCriteria = criteria.createCriteria("addresses");
addCriteria.add(Expression.like("address", "%Shanghai%"));
/*
* (4)DetachedCriteria
* 使Criteria脱离session实例独立存在,这样,我们就可以将某些通用的Criteria
* 查询条件进行抽离,每次使用时再与当前Session实例绑定以获得更好的代码重用效果
*/
DetachedCriteria deCriteria = DetachedCriteria.forClass(TUser.class);
deCriteria.add(Expression.eq("name", "Erica"));
deCriteria.add(Expression.eq("sex",new Integer(1)));
Criteria creiterias = deCriteria.getExecutableCriteria(session);
Iterator it = criteria.list().iterator();
/*
* (5)高级特性
* 通过criteria.setFirstResult/setMaxResults方法可以限制一次查询返回的记录范围:
*/
creiterias.setFirstResult(100);
creiterias.setMaxResults(20);
/*
* 排序
*/
creiterias.addOrder(Order.asc("name"));
/*
* 分组与统计
* 分组、统计表达式由Hibernate3新引入的Projections Class进行封装
* 按照age分组查询
* Projections.groupProperty()方法实际上是对SQL group by子句的封装。同
* 样,我们可以通过Projections.avg(),rowCount(),count(),max(),min(),countDistinct()
* 等方法实现查询统计功能
*/
creiterias.setProjection(Projections.groupProperty("age"));
}
}
posted on 2009-11-05 11:23
王永庆 阅读(318)
评论(0) 编辑 收藏 所属分类:
HIBERNATE