风故故,也依依

Stand still in the wind.

导航

Hibernate的条件查询

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  阅读(1049)  评论(0编辑  收藏  举报