4.4 条 件 查 询
条件查询是更具面向对象特色的数据查询方式。条件查询可通过如下3个类完成:
● Criteria,代表一次查询。
● Criterion,代表一个查询条件。
● Restrictions,产生查询条件的工具类。
执行条件查询的步骤如下:
(1)获得Hibernate的Session对象。
(2)以Session对象创建Criteria对象。
(3)增加Criterion查询条件。
(4)执行Criteria的list等方法返回结果集。
看下面的条件查询示例:
private void test()
{
//获取Hibernate Session对象
Session session = HibernateUtil.currentSession();
//开始事务
Transaction tx = session.beginTransaction();
//创建Criteria和添加查询条件同步完成
//最后调用list方法,返回查询到的结果集
List l = session.createCriteria(Student.class)
//此处增加限制条件必须是Student已经存在的属性
.add( Restrictions.gt("studentNumber" , new Long(20050231) ) )
//如果要增加对Student的关联类的属性的限制则必须重新createCriteria()
/如果此关联属性是集合,则只要集合里任意一个对象的属性满足下面条件
.createCriteria("enrolments")即可
.add( Restrictions.gt("semester" , new Short("2") ) )
.list();
Iterator it = l.iterator();
//遍历查询到的记录
while (it.hasNext())
{
Student s = (Student)it.next();
System.out.println(s.getName());
Set enrolments = s.getEnrolments();
Iterator iter = enrolments.iterator();
while(iter.hasNext())
{
Enrolment e = (Enrolment)iter.next();
System.out.println(e.getCourse().getName());
}
}
tx.commit();
ibernateUtil.closeSession();
}
在条件查询中,Criteria接口代表一次查询,该查询本身不具备任何的数据筛选功能,Session调用createCriteria(Class clazz)方法对某个持久化类创建条件查询实例。
Criteria包含如下两个方法:
● Criteria setFirstResult(int firstResult),设置查询返回的第一行记录。
● Criteria setMaxResults(int maxResults),设置查询返回的记录数。
这两个方法与Query的这两个方法用法相似,都用于完成查询分页。
而Criteria还包含如下常用方法:
● Criteria add(Criterion criterion),增加查询条件。
● Criteria addOrder(Order order),增加排序规则。
● List list(),返回结果集。
Criterion接口代表一个查询条件,该查询条件由Restrictions负责产生,Restrictions是专门用于产生查询条件的工具类,它的方法大部分都是静态方法,常用的方法如下:
● static Criterion allEq(Map propertyNameValues),判断指定属性(由Map参数的key指定)和指定值(由Map参数的value指定)是否完全相等。
● static Criterion between(String propertyName,Object lo, Object hi),判断属性值在某个值范围之内。
● static Criterion ilike(String propertyName, Object value),判断属性值匹配某个字符串。
● static Criterion ilike(String propertyName, String value,MatchMode matchMode),判断属性值匹配某个字符串,并确定匹配模式。
● static Criterion in(String propertyName,Collection values),判断属性值在某个集合内。
● static Criterion in(String propertyName,Object[] values),判断属性值是数组元素的其中之一。
● static Criterion isEmpty(String propertyName),判断属性值是否为空。
● static Criterion isNotEmpty(String propertyName),判断属性值是否不为空。
● static Criterion isNotNull(String propertyName),判断属性值是否为空。
● static Criterion isNull(String propertyName),判断属性值是否不为空。
● static Criterion not(Criterion expression),对Criterion求否。
● static Criterion sizeEq(String propertyName, int size),判断某个属性的元素个数是否与size相等。
● static Criterion sqlRestriction(String sql),直接使用SQL语句作为筛选条件。
● static Criterion sqlRestriction(String sql, Object[] values, Type[] types),直接使用带参数占位符的SQL语句作为条件,并指定多个参数值。
● static Criterion sqlRestriction(String sql, Object value, Type type),直接使用带参数占位符的SQL语句作为条件,并指定参数值。
Order实例代表一个排序标准,Order有如下构造器:
Order(String propertyName, boolean ascending),根据propertyName排序,是否采用升序,如果后一个参数为true,采用升序排序,否则采用降序排序。
如果需要使用关联类的属性来增加查询条件,则应该对属性再次使用createCriteria方法。看如下示例:
session.createCriteria(Person.class)
.add(Restrictions.like("name" , "dd%"))
.createCriteria("addresses")
.add(Restrictions.like("addressdetail" , "上海%"))
.list();
上面的代码表示建立Person类的条件查询,第一个查询条件是直接过滤Person的属性,即选出name属性以dd开始的Person实例,第二个查询条件则过滤Person关联实例的属性,其中addresses是Person类的关联持久化类Address,而addressdetail则是Address类的属性。值得注意的是,查询并不是查询Address持久化类,而是查询Person持久化类。
注意:使用关联类的条件查询,依然是查询原有持久化类的实例,而不是查询被关联类的实例。
posted on 2009-07-19 08:59
jadmin 阅读(144)
评论(0) 编辑 收藏